是否应从drawRect()
或layoutSubviews()
调用CAShapeLayers的图纸?
根据Apple关于UIViews的文档,绘图操作应放在drawRect()
。
然而,在Kevin Cathey的WWDC会议中并非如此:What's New in Interface Builder(他演示了构建可在Interface Builder中访问的自定义UIView的过程)。
在演示期间,他在layoutSubviews
而不是drawRect
执行视图的绘制。
他的解释是:
如果我要实施drawRect,那将无法让我们获得最佳性能;然而,使用子图层和子视图会让我们获得非常好的表现。
从我到目前为止在StackOverflow上读到的内容来看,覆盖drawRect()
方法似乎会导致性能降低。部分原因是setNeedsDisplay
触发手动重绘的费用很高。
但是查看Apple文档和实际应用程序。有意义的是drawRect()
应负责绘制视图,layoutSubviews()
处理定位。
答案 0 :(得分:3)
我想说这取决于。如果形状的大小将取决于自动布局系统,那么在布局子视图和绘制矩形中进行绘制可能是有益的。
首先,为什么布局子视图会有更好的性能?好吧,我有一个UIView(我的父视图)正在绘制一个使用形状图层的圆形视图(我的子视图)。该圆的大小由我父视图中的宽度和高度约束确定。在父视图中更改宽度/高度约束时,我只需要重绘圆圈。这是一个在布局子视图中使用绘图代码是有益的实例,因为我只需要在约束更改时重绘形状图层。我们来看看自动布局周期
当调用布局子视图时,我们知道我们正在使用的框架的大小,并且可以安全地执行我们的绘图。我知道文档说你应该使用这种方法来设置框架,边界等。但是,根据具体情况,在框架内绘图并不合理。
如果圆形视图不依赖于自动布局系统,并且可以随时更改,无论UI的布局如何,那么将绘图用于绘制矩形可能更有利于它可以不断得到更新。我认为这不是一个理想的情况,因为iOS中的更多用户界面符合使用自动布局,因此建议使用布局子视图。