7

如果我创建一个子类UIView并想要使用一堆自定义内容(通过CABasicAnimationusing s 制作动画,使用inCAShapeLayer自定义绘图)什么时候是创建、添加和动画子图层的正确时间?CGContextRefdrawRect

我知道我应该在该drawRect方法中执行自定义绘图(并且因为只有一个地方我可以真正做到UIGraphicsGetCurrentContext()这一点,这有点缩小了我的选择范围)。现在我一直在创建子图层、动画和所有其他与绘图无关的东西drawRect。但我不确定那drawRect是进行此类活动的最佳场所。

我熟悉layoutSubviews方法和其他一些UIView方法,但除了drawRect.

因此,如果我再重复一次 - 问题是:在哪里添加子层,在哪里为它们设置动画,是否有任何技巧或陷阱是我应该注意的?

4

1 回答 1

10
  1. 如果图层是永久性的,您可以在初始化时创建和添加图层。如果它们是动态的,layoutSubviews 会更好。这显然意味着您需要 setNeedsLayout 每当需要新层/项目时。您可以在 -init 和 -layoutSubviews 之间随意混合和匹配,但如果我必须选择,我会说倾向于使用 layoutSubviews。不要使用drawRect。

  2. 您可以在创建时或正常执行期间将属性(strokeWidth、lineColor、路径等)设置为 CAShapeLayer。这包括设置 CAShapeLayer 的路径。同样,不要在 drawRect 中设置属性。

  3. 如果您想在图层上进行自定义绘图,您可以子类化一个图层并在该图层上使用 drawRect。如果需要重用和扩展 CALAyers,这可能会很好。您还可以提供 CALayerDelegate,只要它不是 UIView。请参阅这些问题:使用 CALayer 委托 iOS:使用 UIView 的 'drawRect:' 与它的层的委托 'drawLayer:inContext:'

  4. 动画很简单,它遵循与创建和设置属性相同的原则。确保您了解何时将调用自动动画以及如何禁用它们:禁用 -[CALayer setNeedsDisplayInRect:] 中的隐式动画 再次不要尝试从 drawRect 设置动画:如何使用 CAShapeLayer 制作我的 UIBezierPath 动画?

  5. 画画很贵。动画很便宜。过多地使用 drawRect 会对您的应用程序造成很大的性能影响。谨慎使用 drawRect/setNeedsDisplay,例如在状态变化时(选中/未选中)。尽可能使用动画或顶级属性修改视图,并且不要重绘视图。让 drawRect 做除绘图以外的任何事情都可能导致您不必要地调用 setNeedsDisplay。一个简单的前期优化是尽可能少地调用drawRect,或者根本不调用。

于 2013-09-24T21:02:21.840 回答