Lem*_*ing 8 cocoa core-animation objective-c
Core Animation通过在基于CALayer的类中实现actionForKey方法来允许自定义动画:
- (id<CAAction>)actionForKey:(NSString *)key {
// Custom animations
return [super actionForKey:key];
}
Run Code Online (Sandbox Code Playgroud)
然后我可以创建一个动画并将其返回给onOrderIn动作(即将图层添加到另一个图层时).这很好用.如果我执行相同操作onOrderOut(即从超级图层中删除图层),则会忽略返回的动画,而是应用默认动画.
我的目标是在(onOrderIn)和out(onOrderOut)中缩放图层:
- (id<CAAction>)actionForKey:(NSString *)key {
if ([key isEqualToString:@"onOrderIn"] || [key isEqualToString:@"onOrderOut"]) {
CABasicAnimation *a = [CABasicAnimation animationWithKeyPath:@"transform.scale"];
a.duration = 0.25;
a.removedOnCompletion = NO;
a.fillMode = kCAFillModeBoth;
if ([key isEqualToString:@"onOrderIn"]) {
a.fromValue = [NSNumber numberWithFloat:0.0];
a.toValue = [NSNumber numberWithFloat:1.0];
} else {
a.fromValue = [NSNumber numberWithFloat:1.0];
a.toValue = [NSNumber numberWithFloat:0.0];
}
return a;
}
return [super actionForKey:key];
}
Run Code Online (Sandbox Code Playgroud)
放大作品,缩小不会.而是使用默认的淡出动画.
代码可能包含一些拼写错误,因为我在另一台机器上输入了这个.
有人可以帮忙吗?
引用quartz-dev 邮件列表上的 John Harper 的话:
\n\n\n当动画应该运行时,\n为\nonOrderOut 键\xe2\x80\x94 返回任何动画存在一个根本问题,该层\n不再位于树中,因此\n没有效果。所以 onOrderOut 对于触发动画来说没有用处;当从树中删除层时,\n它可能有助于运行其他代码。
\n我为此找到的最佳解决方案\n(假设父级的默认淡入淡出过渡\n不是您想要的,\n这通常不是您想要的)是添加自定义\动画来应用删除效果\n您然后,在 didStop\nanimation 委托中,实际删除\n该层。使用委托属性设置\n和\nfillMode=forwards、\nremovedOnCompletion=NO 创建一组动画通常很方便,这样您就可以\n删除动画末尾的图层,而无需\n该图层在其正常状态下仍可见。
\n
如果你做了很多这样的情况,那么很容易编写一个通用的超类来启动动画,将动画委托设置为该类并实现 +animationDidStop:来删除未启用动画的图层。这恢复了 CoreAnimation 的即发即忘性质,您希望在默认实现中具有这种性质。
| 归档时间: |
|
| 查看次数: |
1609 次 |
| 最近记录: |