0

我正在尝试一个接一个地执行多个 UIView 动画。但是,我听说一个接一个地执行多个 UIView 动画是不好的做法,我应该改用 Core Animation。我试过这段代码:

//First Animation
[UIView beginAnimations:@"animation1" context:nil];
[UIView setAnimationDuration:2];
nwView.backgroundColor = [UIColor redColor];
nwView.frame = CGRectMake(CGRectGetMidX(screenSize),
                          CGRectGetMinY(screenSize),
                          width, 
                          height);
nwView.transform = CGAffineTransformMakeRotation(45.0f);
[UIView commitAnimations];

//Second Animation
[UIView beginAnimations:@"second animation" context:nil];
[UIView setAnimationDuration:2];

nwView.transform = CGAffineTransformMakeScale(0.5, 0.33);
nwView.backgroundColor = [UIColor purpleColor];

[UIView commitAnimations];

但它只做第二个动画。我知道这个问题类似于UIView 两个动画共存,但它的上下文略有不同。

4

3 回答 3

4

我认为使用 UIView 块连续制作 2 个动画没有任何问题。只需确保在第一个动画的 completino 块中开始您的第二个动画。

没有块(您的示例)它不起作用,因为您必须为动画设置委托或为 setAnimationDidStopSelector 设置选择器。在那里你应该开始第二个动画。

但同样,用块做动画没有错(这是首选方式)。

于 2012-05-29T01:17:55.630 回答
3

如果您希望一个接一个地制作多个动画,这不是这样做的方法。您发布的代码几乎同时执行,这意味着动画将几乎同时执行。

相反,您应该为第一个动画设置委托,然后执行第一个动画。然后当第一个动画调用 animationDidStop 方法时,你应该做第二个动画。这样可以确保它们一个接一个。

假设您调用 doMyAnimations 来启动动画,您就是这样做的。

-(void)doMyAnimations{
    //First Animation
    [UIView beginAnimations:@"animation1" context:nil];
    [UIView setAnimationDuration:2];
    [UIView setAnimationDelegate:self];
    nwView.backgroundColor = [UIColor redColor];
    nwView.frame = CGRectMake(CGRectGetMidX(screenSize),
                              CGRectGetMinY(screenSize),
                              width, 
                              height);
    nwView.transform = CGAffineTransformMakeRotation(45.0f);
    [UIView commitAnimations];
}

- (void)animationWillStart:(NSString *)animationID context:(void *)context{
}

- (void)animationDidStop:(NSString *)animationID finished:(NSNumber *)finished context:(void *)context{
    if([animationID isEqualToString:@"animation1"]){
        //Second Animation
        [UIView beginAnimations:@"second animation" context:nil];
        [UIView setAnimationDuration:2];

        nwView.transform = CGAffineTransformMakeScale(0.5, 0.33);
        nwView.backgroundColor = [UIColor purpleColor];

        [UIView commitAnimations];
    }
}

请记住,nwView 必须在整个班级中都可以访问。如果不是,您可以将其设为实例变量,或者在 animationDidStop 方法中找到另一种访问它的方法。

于 2012-05-29T01:32:43.107 回答
0

您可以为此目的使用块并获得非常干净的结果。

NSMutableArray* animationBlocks = [NSMutableArray new];

typedef void(^animationBlock)(BOOL);

// getNextAnimation
// removes the first block in the queue and returns it
animationBlock (^getNextAnimation)() = ^{
    animationBlock block = (animationBlock)[animationBlocks firstObject];
    if (block){
        [animationBlocks removeObjectAtIndex:0];
        return block;
    }else{
         return ^(BOOL finished){};
    }
};

//add a block to our queue
[animationBlocks addObject:^(BOOL finished){;
    [UIView animateWithDuration:1.0 animations:^{
        //...animation code...
    } completion: getNextAnimation()];
}];

//add a block to our queue
[animationBlocks addObject:^(BOOL finished){;
    [UIView animateWithDuration:1.0 animations:^{
        //...animation code...
    } completion: getNextAnimation()];
}];

//add a block to our queue
[animationBlocks addObject:^(BOOL finished){;
    NSLog(@"Multi-step Animation Complete!");
}];

// execute the first block in the queue
getNextAnimation()(YES);

取自:http: //xibxor.com/objective-c/uiview-animation-without-nested-hell/

于 2013-04-04T00:10:38.327 回答