gpt4 book ai didi

ios - 使用 layoutSubviews 与 drawRect 自定义 UIView 绘图

转载 作者:可可西里 更新时间:2023-11-01 03:32:57 25 4
gpt4 key购买 nike

CAShapeLayers 的绘制应该从drawRect() 调用还是从layoutSubviews() 调用?

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

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

在演示期间,他在 layoutSubviews 中执行 View 的绘制,而不是在 drawRect 中执行。

他的解释是:

If I were to implement drawRect, that's not going to get us the best performance; whereas, using sublayers and subviews is going to get us really good performance.

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

但是查看 Apple 文档和真实世界的应用程序。 drawRect() 负责 View 的绘制,layoutSubviews() 处理定位。

最佳答案

我会说这取决于。如果形状的大小将取决于自动布局系统,那么在 Layout Subview 中绘制而不是在 Draw Rect 中绘制可能会有好处。

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

  1. 更新约束
  2. 布局 subview
  3. 渲染 View

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

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

关于ios - 使用 layoutSubviews 与 drawRect 自定义 UIView 绘图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26584821/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com