UIView анимации не работают правильно - PullRequest
1 голос
/ 15 ноября 2010

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

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

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

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

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

Однако, похоже, она даже не вызывала "lowerButtons".

Ответы [ 3 ]

2 голосов
/ 15 ноября 2010

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

1 голос
/ 15 ноября 2010

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

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

0 голосов
/ 15 ноября 2010

Я думаю, что способ работает так: если вы запустили одну анимацию с данным AnimationID, а затем запустили другую анимацию с тем же идентификатором, вторая «переопределит» первую.использовать два разных animationID в каждом блоке beginAnimation.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...