自定义UIView带有布局的图形子视图与drawRect



应该从drawRect()layoutSubviews()调用CAShapeLayers的绘图吗

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

然而,Kevin Cathey的《WWDC会话:界面生成器的新增功能》(WWDC Session:What's New in Interface Builder)中的情况并非如此(他在其中演示了构建可在界面生成器中访问的自定义UIView的过程)。

在演示过程中,他使用layoutSubviews而不是drawRect绘制视图。

他的解释是:

如果我实施drawRect,那不会给我们带来最好的性能;然而,使用子层和子视图会给我们带来非常好的性能。

从我目前在StackOverflow上读到的内容来看,重写drawRect()方法可能会降低性能。这在一定程度上是由于setNeedsDisplay触发手动重绘的成本很高。

但浏览一下苹果文档和现实世界中的应用程序。drawRect()应该负责视图的绘制,layoutSubviews()负责定位,这是有道理的。

我认为这取决于情况。如果形状的大小将取决于"自动布局"系统,那么在"布局子视图"中绘图可能比在"绘制矩形"中绘图更有利。

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

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

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

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

最新更新