为什么addAnimation:forKey在viewDidLoaded中不起作用
我有以下方法由viewDidLoad调用。 这种方法是创建一个CALayer来显示图像。 该图层有一个掩码,其路径是由我的私有方法创建的UIBezier路径。 我想让蒙版无限旋转,然后向蒙版添加一个CABasicAnimation对象。
- (void) createPathLmask
{
// mask layer
self.pathLayer = [CALayer layer];
self.pathLayer.bounds = CGRectMake(0.0, 0.0, 120, 120);
CGPoint position = self.view.layer.position;
position.y += 140;
self.pathLayer.position = position;
self.pathLayer.backgroundColor = [UIColor redColor].CGColor;
UIImage *backimage = [UIImage imageNamed:@"image2"];
self.pathLayer.contents = (__bridge id)backimage.CGImage;
self.pathLayer.contentsGravity = kCAGravityResizeAspectFill;
// mask
CAShapeLayer *mask = [CAShapeLayer layer];
mask.bounds = CGRectMake(0.0, 0.0, 120, 120);
mask.position = CGPointMake(60.0f, 60.0f);
mask.contentsGravity = kCAGravityResizeAspectFill;
mask.path = [self createBezierPathInRect:mask.bounds].CGPath;
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
// rotate the mask repeatedly
CABasicAnimation *animation = [CABasicAnimation animation];
animation.keyPath = @"transform.rotation";
animation.duration = 4.0f;
animation.byValue = @(M_PI * 2);
animation.repeatCount = HUGE_VALF;
[mask addAnimation:animation forKey:@"rotation_repeatedly"];
});
self.pathLayer.mask = mask;
[self.view.layer addSublayer:self.pathLayer ];
}
我发现旋转动画只能在将addAnimation:forKey放入dispatch_after块并延迟1秒时才起作用。 如果这些代码从块中移出,则掩码不会旋转。
因此,在viewDidLoaded中将动画添加到图层时,一定有些东西没有准备好。 我想知道什么还没准备好? 有没有关于添加动画的适当机会的文档或解释?
因此,在viewDidLoaded中将动画添加到图层时,一定有些东西没有准备好
正确。 对于动画来说这太早了。 请记住,目前的观点仅仅存在,仅此而已; 它甚至不是界面的一部分。 您不能为不属于视图层次结构的视图设置动画。 在这一点上,没有什么可以制作动画。
该视图首先成为第一次调用viewWillAppear
和第一次调用viewDidAppear
之间的接口的一部分。 这就是“出现”意味着什么(而不是什么“加载”)的意思。
苹果公司网站上有很棒的文档。 简单地说,虽然: