【发布时间】:2018-12-01 07:44:38
【问题描述】:
我有一个UIView,它可能同时在屏幕上包含超过 400-500 个字符串。而这个UIView 是可滚动的。第一个决定是使用带有自定义布局的UICollectionView。当UIcollectionView 中的项目同时在屏幕上不超过 30-50 时,它的效果很好。如果我挤压UIView(通过捏合手势)并且它同时在屏幕上显示超过 100-150 个项目,我在尝试滚动时会有延迟(帧速率下降并且绘制 1 帧需要超过 20-50 毫秒) .
好的。然后我决定完全手动绘制UIView。对于绘制形状,我使用 CGContext(即使我同时绘制 1000-2000 个形状也能很好地工作)。但是当我尝试使用 NSAttributedString draw(in: rect) 绘制许多字符串(100-300)时,它在滚动时的性能非常差。
绘制 150 个字符串(帧率很差,接近 30ms 用于绘制)
绘制 300 个字符串(帧率很差,接近 60ms 用于绘制)
所以,问题是 为什么 Swift 中的 NSAttributedString draw(in: rect) 性能不佳? 即使我同时将 300 UILabel 添加到 View 并尝试滚动其帧速率也可以(不是更多每帧 17 毫秒)。 UILabel 如何在屏幕重绘时在内部绘制文本以获得高性能?
【问题讨论】: