我有viewDidLoad调用的以下方法。此方法用于创建CALayer以显示图像。该层有一个掩码,其路径是由我的私有方法创建的UIBezierPath。我希望蒙版无限旋转,然后我将一个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中将动画添加到图层时,必须有一些未准备好的内容。我想知道还没准备好什么呢?是否有关于添加动画的合适机会的文档或解释?
答案 0 :(得分:2)
因此,当在viewDidLoaded
中添加动画时,必须有一些未准备好的东西
正确。这对动画来说太早了。请记住,此时的观点仅存在,而且全部;它甚至不是界面的一部分。您无法为不属于视图层次结构的视图设置动画。此时,没有什么能够制作动画。
视图首先成为第一次调用viewWillAppear
和第一次调用viewDidAppear
之间接口的一部分。这就是“出现”的意思(而不是“加载”)意味着什么。
答案 1 :(得分:-1)
有关Apple网站here的精彩文档。简单地说: