如果我创建了一个子类UIView
并希望使用一组自定义内容(使用CABasicAnimation
通过CAShapeLayer
制作动画,则使用CGContextRef
中的drawRect
制作自定义图片{1}})何时适合创建,添加和动画子图层?
我知道我应该在drawRect
方法中执行自定义绘图(因为我唯一可以实际获得UIGraphicsGetCurrentContext()
的地方可以缩小我的选择范围。)现在我也在drawRect
中创建了子图层,动画和所有其他非绘图相关的东西。但我不确定drawRect
是进行这类活动的最佳场所。
我熟悉layoutSubviews
方法和其他一些UIView
方法但除了drawRect
之外没有实际实现任何方法。
所以,如果我再重复一次 - 问题是:在哪里添加子图层,在哪里制作动画,是否有任何技巧或捕捉我应该注意?
答案 0 :(得分:9)
您可以在init处创建和添加图层(如果它们是永久性的)。如果它们是动态的,则layoutSubviews更好。这显然意味着每当需要新的图层/项目时,您需要setNeedsLayout。您可以在-init和-layoutSubviews之间尽可能多地混合和匹配,但如果我必须选择,我会说倾向于使用layoutSubviews。不要使用drawRect。
您可以在创建时或正常执行期间将属性(strokeWidth,lineColor,path等)设置为CAShapeLayer。这包括设置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,例如状态更改(选中/未选中)。尽可能使用动画或顶级属性修改视图,并且不要重绘视图。使drawRect做除绘制之外的任何事情都可能导致您不必要地调用setNeedsDisplay。一个简单的前期优化是尽可能少地调用drawRect,或者根本不调用。