为什么addAnimation:forKey在viewDidLoaded中不起作用

时间:2016-07-22 01:50:36

标签: ios objective-c uiview core-animation calayer

我有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中将动画添加到图层时,必须有一些未准备好的内容。我想知道还没准备好什么呢?是否有关于添加动画的合适机会的文档或解释?

2 个答案:

答案 0 :(得分:2)

  

因此,当在viewDidLoaded

中添加动画时,必须有一些未准备好的东西

正确。这对动画来说太早了。请记住,此时的观点仅存在,而且全部;它甚至不是界面的一部分。您无法为不属于视图层次结构的视图设置动画。此时,没有什么能够制作动画。

视图首先成为第一次调用viewWillAppear和第一次调用viewDidAppear之间接口的一部分。这就是“出现”的意思(而不是“加载”)意味着什么。

答案 1 :(得分:-1)

有关Apple网站here的精彩文档。简单地说:

  • ViewWillAppear - 在视图控制器视图即将添加到视图层次结构之前以及在配置任何动画以显示视图之前调用此方法。您可以覆盖此方法以执行与显示视图相关联的自定义任务。例如,您可以使用此方法更改状态栏的方向或样式,以与所显示视图的方向或样式进行协调。