2014-10-27 85 views
7

应该从drawRect()layoutSubviews()调用CAShapeLayers图纸吗?自定义UIView绘图与layoutSubviews vs drawRect

根据苹果有关UIViews的文档,绘图操作应该放在drawRect()

然而,凯文卡特的WWDC会议中并不是这种情况:What's New in Interface Builder(他演示了在Interface Builder中可访问的构建自定义UIView的过程)。

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

他的解释是:

如果我要实现的drawRect,这不会让我们的最佳表现;而使用子层和子视图将会使我们获得非常好的表现。

从我迄今为止在StackOverflow上读到的内容来看,重写drawRect()方法可能会导致性能下降。这部分归因于setNeedsDisplay触发手动重画是昂贵的。

但通过Apple文档和现实世界的应用程序。有意义的是drawRect()应该负责View的绘制,并且layoutSubviews()应该负责处理定位。

回答

1

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

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

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

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

如果圆视图不依赖于自动布局系统,并且可以在任何时候更改而不管用户界面的布局如何,那么将绘图绘制成矩形可能会更好,更新。我认为这不是一个理想的情况,因为iOS中的更多用户界面符合使用自动布局,因此建议使用布局子视图。