【发布时间】:2016-11-25 19:09:35
【问题描述】:
我有以下由 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中给layer添加动画的时候肯定有什么东西没有准备好。我想知道什么还没准备好?是否有任何关于添加动画的合适机会的文档或说明?
【问题讨论】:
标签: ios objective-c uiview core-animation calayer