【发布时间】:2014-08-29 21:34:02
【问题描述】:
我正在尝试在 CALayer 上实现自定义属性的动画。我已经将该属性设置为动态的,并且它主要工作。在我的应用程序中,我可能有十几个或更多该层的实例,所有这些实例都应该同时进行动画处理。但是,有时当动画被触发时,一些图层不执行动画。他们简单地直接跳转到最终值。
在尝试调试问题时,看起来当动画开始时,出现问题的图层会在其模型图层上重新绘制动画属性的最终值。其余层仅使用动画属性的瞬态值在其表示层上重绘。通常是最后一层有问题,但有时是随机层。
它是如此零星,我不确定下一步该往哪里看。
这里是触发动画的sn-p代码:
@dynamic aspectModeFraction;
- (id<CAAction>)actionForKey:(NSString *)key
{
if ([key isEqualToString:@"aspectModeFraction"])
{
CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:key];
animation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut];
animation.fromValue = @([[self presentationLayer] aspectModeFraction]);
animation.duration = 2.0f;
animation.delegate = self;
return animation;
}
return [super actionForKey:key];
}
+ (BOOL)needsDisplayForKey:(NSString *)key {
if ([@"fullRect" isEqualToString:key]) { return YES; }
if ([@"localRect" isEqualToString:key]) { return YES; }
if ([@"screens" isEqualToString:key]) { return YES; }
if ([@"aspectModeFraction" isEqualToString:key]) { return YES; }
return [super needsDisplayForKey:key];
}
【问题讨论】:
-
您对动画的要求如何?根据我的经验,使用键值编码总是有效的。所以如果你说例如
myLayer.aspectModeFraction = whatever,试着改用[myLayer setValue:whatever forKey:@"aspectModeFraction"]看看是否有区别。
标签: cocoa calayer caanimation