要在动画期间从绘图方法中访问标准属性,您需要进行一些修改。
实施初始化程序
当 CoreAnimation 执行动画时,它会创建图层的阴影副本,并且每个副本将在不同的帧中渲染。为了创建这样的副本,它调用-initWithLayer:
.
From 苹果的文档:
如果您正在实现自定义图层子类,则可以重写此方法并使用它将实例变量的值复制到新对象中。子类应该始终调用超类的实现。
因此,您需要实施-initWithLayer:
并使用它手动复制新实例上的属性值,如下所示:
- (id)initWithLayer:(id)layer
{
if ((self = [super initWithLayer:layer])) {
// Check if it's the right class before casting
if ([layer isKindOfClass:[MyCustomLayer class]]) {
// Copy the value of "myProperty" over from the other layer
self.myProperty = ((MyCustomLayer *)layer).myProperty;
}
}
return self;
}
通过模型层访问属性
无论如何,副本发生在动画开始之前: 你可以通过添加一个来看到这一点NSLog
拨电至-initWithLayer:
。所以据 CoreAnimation 所知,你的属性将永远为零。此外,它创建的副本是readonly,如果你尝试设置self.myProperty
从内部-drawInContext:
,当在演示文稿副本之一上调用该方法时,您会得到一个异常:
*** Terminating app due to uncaught exception 'CALayerReadOnly', reason:
'attempting to modify read-only layer <MyLayer: 0x8e94010>' ***
而不是设置self.myProperty
,你应该写
self.modelLayer.myProperty = 42.0f
as modelLayer
将改为参考到原来的MyCustomLayer
实例,并且所有演示副本共享相同的模型。请注意,您必须执行此操作当你读取变量时,不仅仅是当您设置它时。为了完整起见,还应该提及该财产presentationLayer
,它会返回当前显示的图层(副本)。