具有异步ImageLoading的自定义单元

时间:2016-01-10 16:00:39

标签: ios swift uitableview autolayout lazy-loading

更新:Github链接包含该项目。如果可能的话,下载并点击重新加载,您将了解其中的差异。 Zhang先生感谢你提出“Aspect Scale to Fill”的建议。它对我帮助不大。

我有一个tableview,它以异步方式加载图像(使用AFNetworking UIImageView类别类)。图像首次在可见单元格上进行压缩。一旦我重新加载或滚动操作和向下图像正在根据其大小进行调整。

基本上我会得到不同尺寸的图片。哪个宽度应该是单元格宽度,高度可以是任何

实现了自我调整的所有必要步骤(适当的自动布局约束和适当的委托方法)

//my tableview setup     
self.tblTest?.estimatedRowHeight = 1000.0 //i've tried with all possible guesses and 
//tried with delegate also 
self.tblTest?.rowHeight = UITableViewAutomaticDimension

我添加了以下约束:

enter image description here

在我的测试单元中。

func setUpImage(url:NSURL){
  //tried with another function also without NSURLRequest
    self.imvTest?.setImageWithURLRequest(NSURLRequest(URL: url),
                                        placeholderImage: UIImage(named: "store_placeholder"),
                                        success: { (requset, response, image) -> Void in
        self.imvTest?.image = image
        print(image.size)

        }, failure: { (error) -> Void in

            self.imvTest?.image = nil
    })
}

结果

enter image description here

预期

enter image description here

我怎样才能第一次防止图像挤压?

P.S:我觉得每次重新加载表格视图都是正确的,并且正在设置时间图像。

请告诉我我一直缺少的内容和任何内容优先事项等,??

2 个答案:

答案 0 :(得分:1)

尝试拨打

tableView.beginUpdates()
tableView.endUpdates()

在成功结束后设置图像

或者在设置图像后使用单元格的indexPath尝试tableView.reloadRowsAtIndexPaths

答案 1 :(得分:0)

我认为正在发生的事情是细胞以其原始内容大小布局。然后异步进入并设置新图像。通常,您在cellForRowAtIndexPath:中设置单元格的数据,这在单元格布局之前发生。但是当图像以异步方式进入时,布局已经发生,所以为时已晚。

当新图片进入时, 数据已更改 ,因此您需要告诉tableview重新加载数据。

不是重新加载整个tableview,而是可以在图像进入时reload an individual cell。这当然比重新加载整个tableview要高效。