何时是在UIView子类中设置动画和添加子图层的正确时间

时间:2013-09-24 17:56:59

标签: ios objective-c animation uiview calayer

如果我创建了一个子类UIView并希望使用一组自定义内容(使用CABasicAnimation通过CAShapeLayer制作动画,则使用CGContextRef中的drawRect制作自定义图片{1}})何时适合创建,添加和动画子图层?

我知道我应该在drawRect方法中执行自定义绘图(因为我唯一可以实际获得UIGraphicsGetCurrentContext()的地方可以缩小我的选择范围。)现在我也在drawRect中创建了子图层,动画和所有其他非绘图相关的东西。但我不确定drawRect是进行这类活动的最佳场所。

我熟悉layoutSubviews方法和其他一些UIView方法但除了drawRect之外没有实际实现任何方法。

所以,如果我再重复一次 - 问题是:在哪里添加子图层,在哪里制作动画,是否有任何技巧或捕捉我应该注意?

1 个答案:

答案 0 :(得分:9)

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

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

  3. 如果要在图层上进行自定义绘图,可以对图层进行子类化并在该图层上使用drawRect。如果CALAyers需要重复使用和扩展,这可能会很好。您也可以提供CALayerDelegate,只要它不是UIView。请参阅以下问题:Using CALayer Delegate AND iOS: Using UIView's 'drawRect:' vs. its layer's delagate 'drawLayer:inContext:'

  4. 动画很简单,它遵循与创建和设置属性相同的原则。确保您了解何时会调用自动动画以及如何禁用它们:Disabling implicit animations in -[CALayer setNeedsDisplayInRect:] 再次尝试不要使用drawRect:How to make my UIBezierPath animated with CAShapeLayer?

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