使用layoutSubviews和drawRect自定义UIView绘图

时间:2014-10-27 09:50:36

标签: ios uiview

是否应从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()处理定位。

1 个答案:

答案 0 :(得分:3)

我想说这取决于。如果形状的大小将取决于自动布局系统,那么在布局子视图和绘制矩形中进行绘制可能是有益的。

首先,为什么布局子视图会有更好的性能?好吧,我有一个UIView(我的父视图)正在绘制一个使用形状图层的圆形视图(我的子视图)。该圆的大小由我父视图中的宽度和高度约束确定。在父视图中更改宽度/高度约束时,我只需要重绘圆圈。这是一个在布局子视图中使用绘图代码是有益的实例,因为我只需要在约束更改时重绘形状图层。我们来看看自动布局周期

  1. 更新约束
  2. 布局子视图
  3. 渲染视图
  4. 当调用布局子视图时,我们知道我们正在使用的框架的大小,并且可以安全地执行我们的绘图。我知道文档说你应该使用这种方法来设置框架,边界等。但是,根据具体情况,在框架内绘图并不合理。

    如果圆形视图不依赖于自动布局系统,并且可以随时更改,无论UI的布局如何,那么将绘图用于绘制矩形可能更有利于它可以不断得到更新。我认为这不是一个理想的情况,因为iOS中的更多用户界面符合使用自动布局,因此建议使用布局子视图。

相关问题