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

Maj*_*ter 6 animation objective-c calayer uiview ios

如果我创建一个子类UIView,并希望使用一堆定制的内容(通过动画CABasicAnimation使用CAShapeLayerS,定制的图形上使用CGContextRefdrawRect)当创建,添加和动画子层正确的时间?

我知道我应该在drawRect方法中执行自定义绘图(因为有一个地方,当我真的可以得到UIGraphicsGetCurrentContext()那种方式缩小我的选择).现在我一直在创建子图层,动画和所有其他非绘图相关的东西drawRect.但我不确定这drawRect是做这类活动的最佳地点.

我熟悉layoutSubviews方法和其他一些UIView方法,但除了实际上没有实现任何方法drawRect.

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

Sal*_*ule 9

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

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

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

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

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