为什么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之间的接口的一部分。 这就是“出现”意味着什么(而不是什么“加载”)的意思。


苹果公司网站上有很棒的文档。 简单地说,虽然:

  • ViewWillAppear - 在视图控制器的视图即将添加到视图层次结构之前以及在配置任何动画以显示视图之前调用此方法。 您可以重写此方法以执行与显示视图关联的自定义任务。 例如,您可以使用此方法更改状态栏的方向或样式,以与所呈现的视图的方向或样式相协调。
  • 链接地址: http://www.djcxy.com/p/74217.html

    上一篇: Why addAnimation:forKey not working in viewDidLoaded

    下一篇: animate a transformed UIImageView?