为什么CALayer动画在加载视图后会起作用,但不仅仅是在初始化之后?

时间:2014-02-26 21:26:00

标签: ios ios7 calayer nib caanimation

我有一个自定义视图(从UIView派生的一个带有旋转动画的小指示器),它在中间和几个球上基本上有一个心形图标(UIImageView)(另一个UIImageView )使用图层动画围绕它旋转。这是我的代码:

-(void)performInitialization{
    self.backgroundColor = [UIColor clearColor];
    CGRect frame = CGRectMake(0, 0, self.frame.size.width, self.frame.size.height);
    UIImageView *imageView = [[UIImageView alloc] initWithFrame:frame];
    [imageView setImage:[UIImage imageNamed:@"RedHeart"]];
    balls = [[UIImageView alloc] initWithFrame:frame];
    [balls setImage:[UIImage imageNamed:@"AngularBalls"]];
    [self addSubview:imageView];
    [self addSubview:balls];

    [balls.layer beginRotating];
}

... CALayer上我的类别包含:

-(void)beginRotatingWithAngularVelocity:(float)velocity{
    CABasicAnimation *rotationAnimation = [CABasicAnimation animationWithKeyPath:@"transform.rotation"];
    rotationAnimation.fillMode = kCAFillModeForwards;
    rotationAnimation.removedOnCompletion = YES;
    rotationAnimation.repeatCount = 999999;
    rotationAnimation.duration = velocity;
    rotationAnimation.cumulative = YES;
    rotationAnimation.fromValue = [NSNumber numberWithFloat:0];
    rotationAnimation.toValue = [NSNumber numberWithFloat:M_PI * 2];
    [self addAnimation:rotationAnimation forKey:ROTATION_KEY];
}

-(void)beginRotating{
    [self beginRotatingWithAngularVelocity:0.7];
}

performInitialization在我的观点的init [WithFrame|WithCoder]方法中调用。我在故事板的主视图中有其中一个视图,视图完美地动画。如果我将自定义视图的多个实例放入该主视图中,它们也会完美地生成动画。如果我将视图放在该故事板上的任何视图中都没有问题。但是,当我将相同的视图放入笔尖的视图中时,它将不会生成动画。相同的代码,IB中的相同设置(复制粘贴以确保一切都相同),但视图仍然停留在初始视图上,好像没有动画附加到图层上)。为什么会这样?如何让这个动画在笔尖上工作?

更新:问题似乎与在视图的初始化程序上创建动画有关。在某些情况下,我在初始化内部动画,但有时,在加载后(例如用户点击某些内容并且正在下载内容)。问题似乎与前一种情况一致。我之前关于故事板和笔尖的谬论显然只是巧合。我已相应更新了标题。

1 个答案:

答案 0 :(得分:4)

初始化太早了。您需要等到视图在界面中(通过didMoveToWindow向视图发出信号。在此之前,视图不是渲染树的一部分(它的图层的绘制/动画是什么)。 / p>