2010-11-15 4 views
1

У меня есть анимация, которая «поднимает» вверх кнопку и оставляет тень. Вот как я это делаю, например.анимация UIView не работает правильно

button1shadow.alpha = 0; 
button1shadow.hidden = NO; 
[UIView beginAnimations:nil context:NULL]; 
[UIView setAnimationDuration:1.5]; 
CGRect frame11 =searchByName.frame; 
frame11.origin.y -=20; 
frame11.origin.x +=20; 
searchByName.frame = frame11; 
searchByNameLabel.frame = frame11; 
CGRect frame21 = button1shadow.frame; 
frame21.origin.y +=10; 
frame21.origin.x -=10; 
button1shadow.frame = frame21; 
searchByName.alpha  = 1; 
button1shadow.alpha  = 0.1; 
[UIView commitAnimations]; 

Это прекрасно работает, если я запускаю его сам по себе.

Затем я поместил этот код сразу после кода выше.

button1shadow.hidden = NO; 
[UIView beginAnimations:nil context:NULL]; 
[UIView setAnimationDelay:2.0]; 
[UIView setAnimationDuration:1.5]; 
CGRect frame11 =searchByName.frame; 
frame11.origin.y +=20; 
frame11.origin.x -=20; 
searchByName.frame = frame11; 
searchByNameLabel.frame = frame11; 
CGRect frame21 = button1shadow.frame; 
frame21.origin.y -=10; 
frame21.origin.x +=10; 
button1shadow.frame = frame21; 
searchByName.alpha  = 1; 
button1shadow.alpha  = 0.1; 
[UIView commitAnimations]; 

Оба прекрасно работают отдельно, но когда я объединить их сразу после друг друга не отображается первая анимация, но кнопка подпрыгивает к координатам я присвоенных вместо оживляющей. Есть идеи?

Edit: Я также попытался вызвать вторую анимацию с помощью:

[NSTimer timerWithTimeInterval:2.0 target:self selector:@selector(lowerButtons) userInfo:nil repeats:NO]; 

Однако, это не кажется, даже называют «lowerButtons».

ответ

2

Вы устанавливаете задержку анимации, поэтому это должно работать, но попытались ли вы сделать вторую анимацию в обратном вызове делегата? Проверьте UIView's +setAnimationDelegate: и +setAnimationDidStopSelector: методов.

+0

Используя комбинацию 'setAnimationDidStopSelector:' и 'setAnimationDelegate:' как вы сказали, мне удалось успешно заставить анимацию работать. Спасибо! –

0

Я думаю, что он работает так, что если вы запустили одну анимацию с данным AnimationID, затем запустили еще одну анимацию с тем же идентификатором, второй - «переопределить» первую.

Таким образом, ответ будет заключаться в использовании двух разных идентификаторов анимации в каждом блоке beginAnimation.

Я не совсем уверен, как тот факт, что вы проходите «ниль», влияет на эту логику. Только один способ узнать ...

+0

Как изменить AnimationID? EDIT: Я бы просто введите NSString вместо nil? –

+0

Да - просто передайте @ «FirstID» или «SecondID» вместо «nil» в качестве первого параметра. – Brad

+0

Ну, похоже, что изменение AnimationID не сработало. –

1

Когда вы совершаете анимацию, сразу же устанавливаются свойства на UIView (или CALayer). Например. если вы переместили представление на 100 пикселей, как только вы перенесли эту анимацию, кадр представления покажет, что он равен 100px, хотя он не похож на него (пока). Если вы хотите очереди анимации один за другим, вам нужно напрямую посмотреть на использование CAAnimation s или настроить вторую анимацию в обратном вызове делегата из первого. Чтобы зарегистрироваться для обратного вызова делегата, см. +[UIView setAnimationDelegate:].

В качестве альтернативы, если вторая анимация просто первая в обратном порядке, вы можете попробовать использовать методы и +[UIView setAnimationRepeatCount:].

+0

Вы знаете, что сумасшедший, я попробовал setAnimationRepeatAutoreverses на один моих анимаций, и оставил остальные четыре одинаковые. По какой-то странной причине эти остальные четыре нормально функционировали. Есть идеи? –

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