1

我正在尝试使用以下代码来执行一些动画

-(void) performSlidingfromX:(int) xx fromY:(int) yy 
{
UIImageView *Image= [self getImage];

[UIView beginAnimations:nil context:NULL];  
[UIView setAnimationDuration: 1.0];
[UIView setAnimationBeginsFromCurrentState:true];
[UIView setAnimationCurve: UIViewAnimationCurveEaseOut];
[token setFrame:CGRectMake(xx, yy, 64, 64)];
[UIView commitAnimations];

}

我在 for 循环中调用它

for (i = 0; i < totMoves; i++) {
    Moment *m = [moments objectAtIndex:i];
    int xx= [m X];
    int yy= [m Y];

    [self performSlidingfromX:xx fromY:yy];

}

我面临的问题是它动画到最终位置,例如,如果我为 xx,yy 输入以下时刻

0,0
50,0
50,50

它将图像对角线从 0,0 移动到 50,50,我希望它先水平滑动,然后垂直滑动。

有什么帮助吗?

谢谢

4

3 回答 3

9

使用新的方块动画。它简单而稳定:

[UIView animateWithDuration:0.5 
                          delay:0 
                        options:UIViewAnimationOptionBeginFromCurrentState
                     animations:^{
                         [token setFrame:CGRectMake(xx, 0, 64, 64)];
                         //here you may add any othe actions, but notice, that ALL of them will do in SINGLE step. so, we setting ONLY xx coordinate to move it horizantly first.
                     } 
                     completion:^(BOOL finished){

                         //here any actions, thet must be done AFTER 1st animation is finished. If you whant to loop animations, call your function here.
                         [UIView animateWithDuration:0.5 
                                               delay:0 
                                             options:UIViewAnimationOptionBeginFromCurrentState 
                                          animations:^{[token setFrame:CGRectMake(xx, yy, 64, 64)];} // adding yy coordinate to move it verticaly} 
                                          completion:nil];
                     }];
于 2011-11-02T07:47:39.597 回答
1

问题是你在for循环中不断地调用“performSlidingfromX:xx fromY:yy”。试试这个代码:

     i=0;
     Moment *m = [moments objectAtIndex:i];
     int xx= [m X];
     int yy= [m Y];
     [self performSlidingfromX:xx fromY:yy];

-(void) performSlidingfromX:(int) xx fromY:(int) yy 
{
i++;
[UIView beginAnimations:nil context:NULL];  
[UIView setAnimationDuration: 1.0];
[UIView setAnimationBeginsFromCurrentState:true];
[UIView setAnimationCurve: UIViewAnimationCurveEaseOut];
[token setFrame:CGRectMake(xx, yy, 64, 64)];
[UIView commitAnimations];


[self performSelector:@selector(call:) withObject:[NSNumber numberWithInt:i] afterDelay:1.1];

}
-(void)call
{
 Moment *m = [moments objectAtIndex:i];
     int xx= [m X];
     int yy= [m Y];
     [self performSlidingfromX:xx fromY:yy];
 }
于 2011-11-02T07:56:00.990 回答
0

制作动画不是阻塞调用。您的代码不会停止并等待动画完成。启动动画后,循环的下一次迭代将立即运行。这会创建一个新动画,它会影响相同的属性,因此它会替换之前的动画。您得到的结果就像您只运行了循环的最后一次迭代。

不幸的是,没有简单的代码块来做你想做的事。您需要检测动画何时结束,然后开始下一个。您需要在比局部变量更广泛的范围内跟踪您的状态(主要是您所在的状态)。

于 2011-11-02T08:52:11.990 回答