代码之家  ›  专栏  ›  技术社区  ›  Michael Neas

UITableView单元格背景图像初始滚动延迟

  •  0
  • Michael Neas  · 技术社区  · 7 年前

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

    目前,每个图像可以在1.8MB到3MB之间变化。对于3x图像,纵横比约为1125x295,对于1x和2x设备,纵横比缩小。有一个首字母。ScaleSpectFill在设置背景图像时被调用,但我不知道这是否是问题所在。我发现6s、X、ipad mini和pro都存在这个问题。

    1. 您建议背景图像的最大文件大小是多少?
    2. 如果我尝试在后台线程上提取UIImages,这是不允许的,因为它需要在主线程上处理UIImages(xCode错误)。
    3. 我应该试着找出如何预处理这些图像吗?

    这是设置背景图像的方法

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

    在单元格的init菜单中,backgroundImageView作为子视图添加到contentView中

    1 回复  |  直到 7 年前
        1
  •  0
  •   Mark Dominick Flores    7 年前

    您可以从背景中提取#2个图像。从backgroundThread将图像加载到内存中,然后通过主线程进行分配

        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 ,它有自己的缓存图像的方法。非常整洁。

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

    override func prepareForReuse() {
        super.prepareForReuse()
    
       //Do your clean up here
    }