UITableView单元格背景图像初始滚动滞后

时间:2018-03-21 14:24:06

标签: ios swift uitableview uiimageview uiimage

我有一个应用程序,其中有一个表格视图严格从资产拉动单元格背景图像。我注意到由于将这些图像加载到表格视图中,fps会在初始滚动上下降。 (如果我只是用黑盒替换UIImage或者给出所有相同的图像,则滚动是无缝的)。一旦表视图中的所有图像第一次加载,滚动操作就没有延迟。

目前每张图片的范围在1.8MB到3MB之间。对于3x图像,纵横比约为1125x295,对于1x和2x设备,纵横比按比例缩小。设置背景图像时会调用initial.scaleAspectFill,但我不知道这是不是问题。我发现这个问题存在于6s,X,ipad mini和pro。

  1. 您建议的背景图片的最大文件大小是多少?
  2. 如果我尝试在后台线程上提取UIImages,则不允许这样做,因为UIImages需要在主线程上进行处理(xCode错误)。
  3. 我应该试着弄清楚如何预先处理这些图像吗?
  4. 这是设置背景图像的方法

    fileprivate let backgroundImageView: UIImageView = {
        let view = UIImageView(axId: "backgroundImage")
        view.contentMode = .scaleAspectFill
        view.layer.masksToBounds = true
        return view
    }()
    

    在单元格的init菜单中,backgroundImageView作为subView

    添加到contentView

1 个答案:

答案 0 :(得分:0)

你可以从背景中做#2拉图像。从backgroundThread将图像加载到内存中,然后通过mainThread

分配它
    fileprivate let backgroundImageView: UIImageView = {
        let view = UIImageView()

        DispatchQueue.global().async {
            let image = getFromSource()

            DispatchQueue.main.async {
                view.image = image
                view.contentMode = .scaleAspectFill
                view.layer.masksToBounds = true
            }
        }

        return view
    }()

或者您可以使用KingFisher缓存图像,{{3}}具有自己的缓存图像的方式。非常整洁。

此外,您可能希望实现prepareForReuse,以便在重复使用单元格时卸载以前的图像。

override func prepareForReuse() {
    super.prepareForReuse()

   //Do your clean up here
}