Стандартизированный метод анимации объектов UIView заключается в использовании следующих методов:
+ animateWithDuration: задержка: параметры: анимации: завершение:
синтаксисэти методы могут быть немного пугающими, если вы не знакомы с Objective-C Blocks .Вот пример использования, который перемещает первое поле, а затем второе поле.
[UIView animateWithDuration:0.3 animations:^{
[field1 setCenter:CGPointMake(FINAL_CENTER_X1, FINAL_CENTER_Y1)];
} completion:^(BOOL finished) {
[UIView animateWithDuration:0.3 animations:^{
[field2 setCenter:CGPointMake(FINAL_CENTER_X2, FINAL_CENTER_Y2)];
}];
}];
РЕДАКТИРОВАТЬ: Для общего решения вашей конкретной проблемы, я бы сделал следующие изменения:
-(IBAction)changeX {
[self timere:field1];
}
-(void) moveP:(UITextField*)f1 {
UITextField*fielder1=f1;
fielder1.center = CGPointMake(fielder1.center.x+4, fielder1.center.y);
if (fielder1.center.x>237) {
[timer1 invalidate];
// I'm really not sure about the scope of field1 and field2, but
// you can figure out the encapsulation issues
if (f1 == field1) {
[self timere:field2];
}
}
}
Более общим и действительно низкоуровневым решением было бы иметь переменную состояния.Возможно, у вас есть что-то вроде NSArray *fields
из UITextField *
и int state = 0
.Там, где я добавил условное выражение в moveP
выше, вы наберете state++
и позвоните [self timere:[fields objectAtIndex:state]]
, если state < [fields count]
.В любом случае, ваш код аннулирования таймера правильный.