使用layoutSubviews和drawRect自定义UIView绘图

Cha*_*Man 7 uiview ios

是否应该从drawRect()或调用CAShapeLayers的图纸layoutSubviews()

根据Apple关于UIViews的文档,应该放置绘图操作drawRect().

然而,在Kevin Cathey的WWDC会话中并非如此:Interface Builder中的新功能(他演示了构建可在Interface Builder中访问的自定义UIView的过程).

在他的演示中,他执行了视图的绘制layoutSubviews,而不是drawRect.

他的解释是:

如果我要实现drawRect,那将无法让我们获得最佳性能; 然而,使用子图层和子视图会让我们获得非常好的表现.

从我到目前为止在StackOverflow上看到的内容来看,覆盖该drawRect()方法似乎会导致性能降低.这部分是由于setNeedsDisplay触发手动重绘是昂贵的.

但仔细查看Apple文档和实际应用程序.drawRect()应该负责绘制视图和layoutSubviews()处理定位是有道理的.

Jam*_*ils 5

我会说这取决于。如果您的形状的大小将取决于自动布局系统,那么在布局子视图与绘制矩形中进行绘制可能会有所帮助。

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

  1. 更新约束
  2. 布局子视图
  3. 渲染视图

当布局子视图被调用时,我们知道我们正在使用的框架的大小并且可以安全地执行我们的绘图。我知道文档说你应该使用这种方法来设置框架、边界等。但是,根据情况,在框架内绘制听起来并不是不合理的。

如果圆形视图不依赖于自动布局系统并且可以随时更改,而不管 UI 的布局如何,那么将绘图放在 draw rect 中可能会更有益,因此它可以不断更新。我认为这不是一个理想的情况,因为 iOS 中更多的 UI 符合使用自动布局,因此建议使用布局子视图。