如果我创建了一个子类 UIView 并想使用一堆定制内容(通过 CABasicAnimation 使用 CAShapeLayer 制作动画,在 CGContextRef 中使用 drawRect 定制绘图)什么时候是创建、添加和动画子图层的合适时机?

我知道我应该在 drawRect 方法中执行自定义绘图(并且因为只有我可以真正获得 UIGraphicsGetCurrentContext() 的地方才能缩小我的选择范围)。现在我也在 drawRect 中创建子图层、动画和所有其他非绘图相关的东西。但我不确定 drawRect 是进行此类事件的最佳场所。

我熟悉 layoutSubviews 方法和其他一些 UIView 方法,但除了 drawRect 之外还没有真正实现它们中的任何一个。

因此,如果我再重复一遍,那么问题就来了:问题是在哪里添加子图层,在何处为其设置动画以及我应该注意的任何技巧或捕获?

最佳答案

  • 如果层是永久性的,您可以在初始化时创建和添加层。如果它们是动态的,则 layoutSubviews 更好。这显然意味着您需要在需要新图层/项目时设置 setNeedsLayout。您可以在-init和-layoutSubviews之间随意混合和匹配,但如果必须选择,我会倾向于使用layoutSubviews。不要使用 drawRect。
  • 您可以在创建时或正常执行期间为 CAShapeLayer 设置属性(strokeWidth、lineColor、path 等)。这包括设置CAShapeLayer的路径。同样,不要在 drawRect 中设置属性。
  • 如果您想在图层上进行自定义绘图,您可以将图层子类化并在该图层上使用 drawRect。如果需要重用和扩展 CALAyers,这会很好。你也可以提供一个 CALayerDelegate,只要它不是 UIView。请参阅以下问题:Using CALayer Delegate AND
    iOS: Using UIView's 'drawRect:' vs. its layer's delagate 'drawLayer:inContext:'
  • 动画很简单,它遵循与创建和设置属性相同的原则。确保您了解何时调用自动动画以及如何禁用它们:Disabling implicit animations in -[CALayer setNeedsDisplayInRect:]
    再次不要尝试从 drawRect 制作动画:How to make my UIBezierPath animated with CAShapeLayer?
  • 绘图很贵。动画很便宜。过多地使用 drawRect 会对您的应用程序造成很大的性能影响。谨慎使用 drawRect/setNeedsDisplay,例如在状态更改(选中/未选中)时。尽可能使用动画或顶级属性修改 View ,并且不要重绘 View 。使 drawRect 执行除绘制以外的任何操作可能会导致您不必要地调用 setNeedsDisplay。一个简单的前期优化是尽可能少地调用 drawRect,或者根本不调用。
  • 关于ios - 何时是在 UIView 子类中设置动画和添加子层的合适时机,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18988696/

    10-14 21:20