使用layoutSubviews和drawRect进行自定义UIView绘制的区别

12

在绘制CAShapeLayers时,应该从drawRect()还是layoutSubviews()调用?

根据苹果关于UIView的文档,绘制操作应放在drawRect()中。

然而,在Kevin Cathey的WWDC Session: What's New in Interface Builder(他演示了构建可在Interface Builder中访问的自定义UIView的过程)中并非如此。

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

他的解释是:

如果我实现drawRect,那么性能就不会太好,而使用子层和子视图会给我们带来非常好的性能。

根据我在StackOverflow上阅读到的内容,重写drawRect()方法可能会导致性能降低。这部分原因是因为setNeedsDisplay触发手动重绘是比较昂贵的。

从苹果文档和实际应用来看,drawRect() 负责视图的绘制,而 layoutSubviews() 则处理定位。

1个回答

5
我会说这取决于情况。如果您的形状的大小依赖于自动布局系统,那么在Layout Subview中绘制可能更有利而不是在Draw Rect中进行。首先,为什么Layout Subviews性能更好呢?假设我有一个UIView(我的父视图),它正在绘制一个Circle View(我的子视图),它使用了一个shape layer。该圆的大小由Parent View中的宽度和高度约束确定。只有当父视图上的宽度/高度约束发生更改时,我才需要重绘圆形。这是一个例子,在这种情况下,在Layout Subviews中具有绘图代码很有益,因为我只需要在约束更改时重新绘制形状层。让我们看一下自动布局周期:
1. 更新约束 2. 布局子视图 3. 渲染视图
当调用layout subviews时,我们已知道要处理的框架的大小,并且可以安全地执行绘图。我知道文档说你应该使用此方法来设置框架、边界等。但是,根据情况在框架内部进行绘制似乎并不不合理。
如果Circle View不依赖于自动布局系统,并且可能随时更改而与UI的布局无关,则在draw rect中进行绘制可能更有利,因此可以不断更新。我认为这不是一个理想的情况,因为在iOS中更多的UI符合使用自动布局,因此建议使用Layout Subviews。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接