Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios Swift:在UITableViewCell中异步加载图像-自动布局问题_Ios_Swift_Uitableview_Autolayout - Fatal编程技术网

Ios Swift:在UITableViewCell中异步加载图像-自动布局问题

Ios Swift:在UITableViewCell中异步加载图像-自动布局问题,ios,swift,uitableview,autolayout,Ios,Swift,Uitableview,Autolayout,在我的UITableViewCell中,我有一个UIImageView异步下载图像(使用翠鸟库)。它与Instagram非常相似 我正在使用autolayout,我想对行高使用UITableView.automaticDimension。如何设置约束,使单元格的高度根据图像变高或变短?如果我为UIImageView高度设置初始约束,并在下载图像后进行更改,则至少有一个元素可以更改其高度以“填充”添加(或删除)的空间通过UIImageView使用图像的实际大小和每个图像的设备屏幕大小计算宽高比保

在我的
UITableViewCell
中,我有一个
UIImageView
异步下载图像(使用翠鸟库)。它与Instagram非常相似


我正在使用autolayout,我想对行高使用
UITableView.automaticDimension
。如何设置约束,使单元格的高度根据图像变高或变短?如果我为
UIImageView
高度设置初始约束,并在下载图像后进行更改,则至少有一个元素可以更改其高度以“填充”添加(或删除)的空间通过
UIImageView

使用图像的实际大小和每个图像的设备屏幕大小计算宽高比保留高度,并更新UITableViewCell上的UIImageView高度约束

只需在tableView上调用feedCell.configure(使用:FeedImage)(\uU2:cellForRowAt:)


您必须按比例裁剪图像,然后保存到翠鸟缓存

let cached = ImageCache.default.imageCachedType(forKey: url)
        if cached != .none {
            getImageFromCache(key: url) { [weak self] (cachedImage) in
                self?.image = cachedImage
                self?.completionHandler?(cachedImage)
            }
        }
        else {
            getImageFromServer(key: url) { [weak self] (cahcedImage) in
                self?.image = cahcedImage
                ImageCache.default.store(cahcedImage, forKey: self!.url)
                self?.completionHandler?(cahcedImage)
            }
        }





 func getImageFromCache(key:String,complition:@escaping (UIImage)->()) {
        ImageCache.default.retrieveImage(forKey: url, options: nil) { [weak self] (image, cachetype) in

            guard let cachedImage = image , let opCancelled = self?.isCancelled , opCancelled == false  else {
                return
            }
            complition(cachedImage)
        }
    }

    func getImageFromServer(key:String,complition:@escaping (UIImage)->()) {
        if let imageUrl = URL(string: key) {
            KingfisherManager.shared.retrieveImage(with: imageUrl, options: nil, progressBlock: nil) { [weak self] (image, error, cachetype, _ ) in
                if error == nil {
                    guard let cachedImage = image , let opCancelled = self?.isCancelled , opCancelled == false  else {
                        return
                    }


                        let finalheight = (UIScreen.main.bounds.width * CGFloat(cachedImage.size.height)) / CGFloat(cachedImage.size.width)
                        let newImage = cachedImage.resize(targetSize: CGSize(width: UIScreen.main.bounds.width, height: finalheight))
                        complition(newImage)

                }
                else {
                    print("Error ###### == Errror While Downloading Image")
                }
            }
        }
        else {
            print("Error ###### == can't create Url of String")
        }
    }

您需要根据图像的高度手动计算每个单元格的高度。这将是一个真正的混乱。但是,我应该在哪里设置新高度?您必须在
tableView(\u:heightForRowAt:)
方法中传递新高度。实际高度在单元格内计算,并在调用tableView(\u:heightForRowAt:)后传递。每次刷新整个tableView是唯一的选项?是的。这是下载图像后根据图像获取单元格高度的唯一选项。否则,您必须在API本身中接受图像的aspectRatio。我就是这么做的,但单元格的高度不正确,因为其他项目会拉伸以适合我在情节提要中定义的单元格的原始高度。将UITableViewAutomaticDimension设置为UITableView行高,并为估计的行高设置单元格的近似高度,而不是直接设置。我的解决方法是让API在下载之前向我发送图像大小,这样我可以在设置单元格时设置UIImageView的高度。它成功了,但仅仅是因为我有机会编辑API。是的,你走对了:)你还应该下载图像的裁剪版本以适合uiimageview。要下载的图像尺寸必须提供与计算高度相同的比例。
let cached = ImageCache.default.imageCachedType(forKey: url)
        if cached != .none {
            getImageFromCache(key: url) { [weak self] (cachedImage) in
                self?.image = cachedImage
                self?.completionHandler?(cachedImage)
            }
        }
        else {
            getImageFromServer(key: url) { [weak self] (cahcedImage) in
                self?.image = cahcedImage
                ImageCache.default.store(cahcedImage, forKey: self!.url)
                self?.completionHandler?(cahcedImage)
            }
        }





 func getImageFromCache(key:String,complition:@escaping (UIImage)->()) {
        ImageCache.default.retrieveImage(forKey: url, options: nil) { [weak self] (image, cachetype) in

            guard let cachedImage = image , let opCancelled = self?.isCancelled , opCancelled == false  else {
                return
            }
            complition(cachedImage)
        }
    }

    func getImageFromServer(key:String,complition:@escaping (UIImage)->()) {
        if let imageUrl = URL(string: key) {
            KingfisherManager.shared.retrieveImage(with: imageUrl, options: nil, progressBlock: nil) { [weak self] (image, error, cachetype, _ ) in
                if error == nil {
                    guard let cachedImage = image , let opCancelled = self?.isCancelled , opCancelled == false  else {
                        return
                    }


                        let finalheight = (UIScreen.main.bounds.width * CGFloat(cachedImage.size.height)) / CGFloat(cachedImage.size.width)
                        let newImage = cachedImage.resize(targetSize: CGSize(width: UIScreen.main.bounds.width, height: finalheight))
                        complition(newImage)

                }
                else {
                    print("Error ###### == Errror While Downloading Image")
                }
            }
        }
        else {
            print("Error ###### == can't create Url of String")
        }
    }