Я возиться с базовым примером CAAnimation, где я просто пытаюсь заставить CALayer вращаться в подклассе UIView.Я начинаю с создания нового CALayer с красным фоном и вставки его в self.layer.Затем я создаю CAAnimation, которая должна срабатывать при изменении непрозрачности, и применяю ее к слою CALayer, после чего он вращается, как и ожидалось.
Странная вещь в том, что если я пытаюсь применить точно такую же анимацию, используя executeSelector: withObject: afterDelay:, CALayer больше не анимирует, хотя его непрозрачность все еще изменяется.Еще более странно то, что если я использую executeSelector: 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
Примечание. Я создаю экземпляр этого представления с фреймом, равным [UIScreen mainScreen].applicationFrame
, внутри делегата приложения.