我正在制作一组按钮,这样它们就会移动到屏幕左侧,然后它们会神奇地移动到屏幕右侧。我通过致电:
来做到这一点[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);
}
答案 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];
}
作为旁注;除非您实际使用响应委托方法的委托,否则无需为动画指定名称或上下文。正如我在此示例中所做的那样,只需传递nil
和NULL
。
答案 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的一个风格点,你可以形成自己的观点。
干杯