Cocoa Touch - 动画UIView的中心属性

时间:2011-03-15 19:22:33

标签: iphone cocoa-touch animation

我有这个UIView包含两个相同的UIImageViews并列。 我希望这个视图从右到左翻译,当视图到达终点时,立即将其中心重置为默认值,以给出连续性的幻觉。

我的问题是,当我在非动画块中设置默认中心时,该段落是动画的,我看到我的视图“倒带”。

这是我正在使用的代码:

-(void)drunkenMove{

int newCenterX=40;

BOOL animation=YES;


CGPoint newCenter;
if(starView.center.x<=-0){ //so the view has reached the end, being 960*320
newCenter=CGPointMake(480, starView.center.y); //create a reset center
    animation=NO;
}else{
newCenter=CGPointMake(starView.center.x-newCenterX, starView.center.y); //else move on
    animation=YES;
}
    if (animation==YES) {
        [UIView beginAnimations:NULL context:nil];
        [UIView setAnimationCurve:UIViewAnimationCurveLinear];
        [UIView setAnimationDuration:0.3f];
        [UIView setAnimationBeginsFromCurrentState:YES];
        starView.center=newCenter;
        [UIView commitAnimations];
    }else{
        starView.center=newCenter; //here I want to set the center instantly
        [UIView beginAnimations:NULL context:nil];
        [UIView setAnimationCurve:UIViewAnimationCurveLinear];
        [UIView setAnimationDuration:0.3f];
        [UIView setAnimationBeginsFromCurrentState:YES];
        starView.center=CGPointMake(480+newCenterX, starView.center.y);;
        [UIView commitAnimations];
    }

}

我期待看到我的中心重置然后动画,但我也得到了重置中心的动画。 知道为什么吗? 我遇到了与其他UIView动画类似的问题所以我想我可能错过了一些东西。 顺便说一句,这个函数由循环线程调用。

感谢。

修改

我的问题以某种方式由方法

创建
[UIView setAnimationBeginsFromCurrentState:YES];

从UIView类引用: 讨论 在iOS 4.0及更高版本中不鼓励使用此方法。相反,您应该使用animateWithDuration:delay:options:animations:completion:方法来指定动画和动画选项。

我希望这可以节省一些时间。

2 个答案:

答案 0 :(得分:0)

我使用的方法几乎和你一样,对我来说它有效。也许[UIView setAnimationBeginsFromCurrentState:YES];引起你的问题,但我不确定。

答案 1 :(得分:0)

我相信你的“重置”

starView.center=newCenter;
在您创建的以下动画中,else子句中的

将被CoreAnimation自动包装以提高效率。摆脱那个动画:

}else{
    starView.center=newCenter; //here I want to set the center instantly
    //[UIView beginAnimations:NULL context:nil];
    //[UIView setAnimationCurve:UIViewAnimationCurveLinear];
    //[UIView setAnimationDuration:0.3f];
    //[UIView setAnimationBeginsFromCurrentState:YES];
    //starView.center=CGPointMake(480+newCenterX, starView.center.y);;
    //[UIView commitAnimations];
}

并且子视图将以您想要的方式“跳跃”。移动动画将在此方法的下一个循环中再次启动。