UIView动画互相取消

时间:2013-04-05 10:27:19

标签: ios animation uiview block objective-c-blocks

播放多个UIView动画块时出现问题。

我所拥有的是一个有很多按钮的游戏,当你按下一个按钮时,它会产生一个UILabel,动画到屏幕的顶部,在那里被“添加”到总点数量,这是通过使用3完成的嵌套块。 这很好用,让我可以使用动画生成尽可能多的点标签。

    //setup the label
    UILabel *pointIndicator = [[UILabel alloc]initWithFrame:CGRectMake(button.button.frame.origin.x, button.button.frame.origin.y, 60, 30)];
    pointIndicator.backgroundColor = [UIColor clearColor];
    pointIndicator.font = [UIFont boldSystemFontOfSize:25];
    pointIndicator.alpha = 0;
    pointIndicator.layer.shadowOffset = CGSizeMake(1.0f, 1.0f);
    pointIndicator.layer.shadowOpacity = 0.6;
    pointIndicator.layer.shadowRadius = 1;

    [pointIndicators addObject:pointIndicator];
    [self.view addSubview:pointIndicator];


    CGPoint scoreLabelPosition = [self.view convertPoint:self.totalScoreLabel.frame.origin fromView:self.totalScoreLabel.superview];
    CGSize scoreLabelSize = [self.totalScoreLabel.text sizeWithFont:self.totalScoreLabel.font];

    [UILabel animateWithDuration:0.3 delay:0 options:UIViewAnimationCurveEaseIn animations:^{

        //Make label appear and move it above button
        CGRect frame = pointIndicator.frame;
        frame.origin.y -= 30;
        pointIndicator.frame = frame;
        pointIndicator.alpha = 1;

    }completion:^(BOOL finished){


        [UILabel animateWithDuration:0.4 delay:0 options:UIViewAnimationCurveEaseInOut animations:^{

            //Move the label next to the score label
            NSInteger YPosition = 0;
            if ([UIDevice currentDevice].userInterfaceIdiom == UIUserInterfaceIdiomPad){

                YPosition = 15;

            }else{

                YPosition = 2;
            }
            CGRect frame = pointIndicator.frame;
            frame.origin.x = scoreLabelPosition.x + self.totalScoreLabel.frame.size.width/2 + scoreLabelSize.width/2 + 5;
            frame.origin.y = scoreLabelPosition.y - self.totalScoreLabel.frame.size.height/2 + YPosition;
            pointIndicator.frame = frame;

        }completion:^(BOOL finished){

            [UILabel animateWithDuration:0.5 animations:^{

                pointIndicator.alpha = 0;

            }completion:^(BOOL finished){

                //Animate point label to increase a bit in size
                CABasicAnimation *pointAnim = [CABasicAnimation animationWithKeyPath:@"transform"];
                pointAnim.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
                pointAnim.duration = 0.1;
                pointAnim.repeatCount = 1;
                pointAnim.autoreverses = YES;
                pointAnim.removedOnCompletion = YES;
                pointAnim.toValue = [NSValue valueWithCATransform3D:CATransform3DMakeScale(1.5, 1.5, 1.0)];
                [self.totalScoreLabel.layer addAnimation:pointAnim forKey:nil];

                [pointIndicator removeFromSuperview];
                [pointIndicators removeObject:pointIndicator];
            }];


        }];

    }];

但是,当游戏结束时,所有按钮都会在屏幕外生动,图像视图的大小会从中间增大,每个按钮都使用1个动画块。

问题在于,如果UILabel在游戏结束的同时在屏幕上进行动画制作,则会取消按钮动画和不断增长的图像动画。如果没有产生UILabel,一切都会发挥作用。我尝试在播放其他动画之前取消并删除所有点标签,但没有运气。如果所有以前的动画都已提前正常完成,它似乎才有效。这是我删除它们的方式:

for(UIView *pointView in pointIndicators){

    [pointView.layer removeAllAnimations];
    [pointView removeFromSuperview];
}
[pointIndicators removeAllObjects];
[self.totalScoreLabel.layer removeAllAnimations];

所有动画视图都是同一个UIView的子视图。我注意到如果我制作按钮的点标签子视图,所有动画都可以同时播放。

我似乎无法弄清楚这种行为,动画之间是否存在某种冲突?

0 个答案:

没有答案