移动对象而不在动画块中设置动画

时间:2010-11-16 08:24:27

标签: iphone cocoa-touch uiview core-animation

我正在制作一组按钮,这样它们就会移动到屏幕左侧,然后它们会神奇地移动到屏幕右侧。我通过致电:

来做到这一点
[NSTimer scheduledTimerWithTimeInterval:0.20 target:self selector:@selector(moveTheButtons) userInfo:nil repeats:YES];
在viewDidLoad中

他们在左边快乐地制作动画,但随后他们将动画重新向右移动。我只是希望它们消失并重新出现在屏幕右侧。因为我是新手,所以我认为因为它是在commitAnimations之后调用它不会动画的。我认为问题是动画实际上在moveTheButtons函数返回后“提交”,但我想不出一种优雅(或标准)的方式。

如何在不动画的情况下将UIButton移出屏幕,最好还是在moveTheButtons功能中?

正如你可能推断的那样,我对iPhone上的动画很陌生,所以如果你看到任何其他错误我会随时给我一些指示。

-(void)moveTheButtons{
NSLog(@"moveTheButtons");

[UIView beginAnimations:@"mov-ey" context:cloudA];
[UIView setAnimationDuration: .20];
[UIView setAnimationCurve:UIViewAnimationCurveLinear];
cloudA.center = CGPointMake(cloudA.center.x-pos.x,cloudA.center.y);
[UIView commitAnimations];


if(cloudA.center.x < -100){
    //I don't want to animate this bit. 
    cloudA.center = CGPointMake(550,cloudA.center.y);
}

//NSLog(@"cloudA.center.x %f", cloudA.center.x);
}

2 个答案:

答案 0 :(得分:2)

您可以使用+[UIView setAnimationsEnabled:]方法暂时关闭动画块中属性的隐式动画。这在许多用例中非常有用。

做这样的事情:

-(void)moveTheButtons {
    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration: .20];
    [UIView setAnimationCurve:UIViewAnimationCurveLinear];
    CGPoint center = CGPointMake(cloudA.center.x - pos.x, cloudA.center.y);
    if (center.x < -100) {
        [UIView setAnimationsEnabled:NO];
        cloudA.center = CGPointMake(550, center.y);
        [UIView setAnimationsEnabled:YES];
    } else {
        cloudA.center = center;
    }
    [UIView commitAnimations];
}

作为旁注;除非您实际使用响应委托方法的委托,否则无需为动画指定名称或上下文。正如我在此示例中所做的那样,只需传递nilNULL

答案 1 :(得分:1)

预先计算点,反转顺序并在动画块之前返回。

在所有情况下,您都无条件地将动画提交给引擎。

-(void)moveTheButtons{
NSLog(@"moveTheButtons");

CGPoint mypoint = CGPointMake(cloudA.center.x-pos.x,cloudA.center.y);

if(cloudA.center.x < -100){
    //I don't want to animate this bit. 
    cloudA.center = CGPointMake(550,cloudA.center.y);
    return;
}


[UIView beginAnimations:@"mov-ey" context:cloudA];
[UIView setAnimationDuration: .20];
[UIView setAnimationCurve:UIViewAnimationCurveLinear];
cloudA.center = mypoint;
[UIView commitAnimations];

}

关于使用return而不是if / else的一个风格点,你可以形成自己的观点。

干杯