【问题标题】:UICollectionView scroll lagUICollectionView 滚动滞后
【发布时间】:2013-12-10 12:32:56
【问题描述】:

我在一个单元格中设置了一个包含 10 个子视图的集合视图。

子视图是 -带有标签的图像视图 -文本视图 -imageview -uilabel -imageview -uilabel

最初,集合视图在 iPad 上显示了 15 个单元格。不,当我滚动滚动暂停时,需要替换底部或顶部的单元格(重用单元格)。我删除了阴影,但仍然是同样的问题。

所以当旧单元被重复使用导致延迟时,问题就会发生。

顺便说一句,没有通过网络加载图像。

【问题讨论】:

    标签: performance scroll collectionview


    【解决方案1】:

    我很久以前就有了这个问题的答案,但为了其他人的利益以及可能遇到同样问题的人。

    除了去除阴影之外,您还需要去除“清晰的颜色”背景。任何需要额外处理的额外图纸都应删除或替换为替代图纸。任何繁重的工作、文本格式、日期格式都应该在显示集合或表格视图之前完成。确保您的单元格仅进行呈现而不进行处理。如果您无法避免它,请在另一个线程上进行处理。

    要测量滚动速率,您需要使用仪器 > 图形 > 核心动画工具来测量帧速率。

    试一试,你会发现不同。

    【讨论】:

      【解决方案2】:

      编辑:无需尝试自动调整掩码,只需阅读这篇关于 UICollectionView 性能提升的简短文章http://noxytrux.github.io/blog/2014/09/25/ios8-weirdness-part3-laggy-uicollectionview/

      这可能是自动布局开销。考虑改为尝试自动调整蒙版大小。

      您可以提交所有内容并进行实验:

      1. 关闭单元格 xib 文件的自动布局
      2. 运行应用来测试性能(不用担心布局混乱)
      3. 设置自动调整掩码(如果需要,在代码中进行布局)而不是自动布局(如果效果明显)

      我通过这种方式修复了我的 UICollectionView 性能问题。当您一次有很多可见单元格时,它最有帮助。

      另外,如果您有图片浏览量,请查看此答案Setting image property of UIImageView causes major lag

      不要忘记 Instruments:运行 Time Profiler,看看什么最占用您的主线程时间。

      【讨论】:

      • 为我修复了它。救生员!
      【解决方案3】:

      我猜这个问题也可能是因为 ImageView。

      使用 Kingfisher 5 进行预取、加载、显示和缓存图像将解决该问题。

      let url = URL(fileURLWithPath: path)
      let provider = LocalFileImageDataProvider(fileURL: url)
      imageView.kf.setImage(with: provider)
      

      https://github.com/onevcat/Kingfisher/wiki/Cheat-Sheet#image-from-local-file

      【讨论】:

        【解决方案4】:
        fileprivate func downloadForPerformance()->void{
           for i in urlToFetchImageArray {
               var image: UIImage = dowloadImageFunc(link: i.urlString() );
               imageArray.append( image );
           }
        }
        fileprivate func dowloadImageFunc(link: String)->UIImage {
            let url = URL(string: link)
            let data = try? Data(contentsOf: url!)
            return UIImage(data: data!) ?? UIImage(named: "default.png")!;
        }
        
        
        cell?.mainImage.image = self.imageArrayPerformance[indexPath.row];
        

        通常问题是下载速度慢,因为每个单元格都在出队。

        1. 在视图出现之前调用 downloadForPerformance 函数。
        2. 这将填充一个名为 imageArray 的数组作为全局变量
        3. 然后在 cellForItem 函数中使用该数组

        基本上有一个您需要的已下载图像数组,将其设为 [UIImage] 数组,然后使用 theImageArray[indexPath.row]

        【讨论】:

          猜你喜欢
          • 2018-10-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多