2010-11-16 7 views
0

Я анимация пучка кнопок, поэтому они перемещаются влево от экрана, после чего они должны волшебным образом перемещаться вправо от экрана. Я делаю это по телефону:Перемещение объекта без анимации в блоке анимации

[NSTimer scheduledTimerWithTimeInterval:0.20 target:self selector:@selector(moveTheButtons) userInfo:nil repeats:YES]; 

in 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); 
} 

ответ

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]; 

} 

Theres точка стиля об использовании возврата, а не if/else, но вы можете составить собственное мнение.

Приветствия

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, как я сделал в этом примере.

+0

Спасибо за отзыв о контексте и имени! Сначала Уоррен ответил, поэтому он получает правильный тик, но я действительно ценю ваш ответ и предложение. – glenstorey

Смежные вопросы