我正在搞乱一个基本的CAAnimation示例,我只是想让一个CALayer在UIView的子类中旋转。我首先创建一个红色背景的新CALayer并将其插入self.layer。然后我制作一个应该在不透明度变化时触发的CAAnimation并将其应用到CALayer,然后按预期旋转。
奇怪的是,如果我尝试使用performSelector应用完全相同的动画:withObject:afterDelay:,CALayer不再动画,尽管它的不透明度仍会改变。甚至更奇怪的是,如果我使用performSelector:withObject:afterDelay:使用几乎相同的代码为self.layer制作动画,它就可以工作。
关于发生了什么的任何想法?这是我的代码:
- (id)initWithFrame:(CGRect)frame {
self = [super initWithFrame:frame];
if (self) {
point = [[CAGradientLayer alloc] init];
point.backgroundColor = [UIColor redColor].CGColor;
point.bounds = CGRectMake(0.0f, 0.0f, 30.0f, 20.0f);
point.position = CGPointMake(100.0f, 100.0f);
[self.layer addSublayer:point];
[point release];
[self performSelector:@selector(test) withObject:nil afterDelay:2];
}
return self;
}
-(void)test {
[self spinLayer:point];
// [self spinLayer:self.layer]; works here
}
-(CAAnimation*)animationForSpinning {
CATransform3D transform;
transform = CATransform3DMakeRotation(M_PI/2.0, 0, 0, 1.0);
CABasicAnimation *basicAnimation = [CABasicAnimation animationWithKeyPath:@"transform"];
basicAnimation.toValue = [NSValue valueWithCATransform3D:transform];
basicAnimation.duration = 5;
basicAnimation.cumulative = NO;
basicAnimation.repeatCount = 10000;
return basicAnimation;
}
-(void)spinLayer:(CALayer*)layer {
CAAnimation *anim = [self animationForSpinning];
[layer addAnimation:anim forKey:@"opacity"];
layer.opacity = 0.6;
}
这是我的界面
@interface MyView : UIView {
CALayer *point;
}
-(void)test;
-(void)spinLayer:(CALayer*)layer;
-(CAAnimation*)animationForSpinning;
@end
注意:我在app委托中使用等于[UIScreen mainScreen].applicationFrame
的框架实例化此视图。
答案 0 :(得分:1)
改变这个:
[layer addAnimation:anim forKey:@"opacity"];
进入这个:
[layer addAnimation:anim
forKey:@"notOpacity!"];
隐式动画layer.opacity = 0.6
会覆盖您的显式动画。这是因为Core Animation在添加隐式动画时使用属性名称。
(如果您将layer.opacity = 0.6
移到[layer addAnimation:anim forKey:@"opacity"];
之上,它也会有效,但layer.opacity
不会动画效果。)
为什么它会毫不拖延地工作:因为只有当图层在树中并且已经显示时,隐式动画才会“启用”。