Обе анимации запускаются в одном и том же цикле запуска (именно так работают анимации UIView - все анимации в одном цикле запуска «сцепляются». Вам нужно будет использовать
[UIView setAnimationDelay:3.0];
На второй анимации.
<ч />
Пример кода
Есть два способа сделать это: использовать стандартную анимацию начала / фиксации или метод блоков. В этом примере используется код анимации начала / фиксации, который у вас есть. Проблема заключается в том, что анимации объединяются, и, не заходя в CA, стандартное поведение анимации состоит в том, что один «принудительно» завершается до запуска других. Это связано с циклами выполнения; Построение анимационных интерфейсов из WWDC 2010 углубляется в это. Но код для выполнения того, что вы хотите, выглядит так:
- (void)fadeOut {
[UIView beginAnimations:@"Animation2" context:NULL];
[UIView setAnimationDuration:3];
[self.testView setAlpha:0.00];
[UIView commitAnimations];
}
- (IBAction)animate {
[UIView beginAnimations:@"Animation1" context:NULL];
[UIView setAnimationDuration:3];
[self.testView setAlpha:1.00];
[UIView commitAnimations];
[self performSelector:@selector(fadeOut) withObject:nil afterDelay:3.0];
}
Вы должны заставить его разорвать цикл выполнения, в основном. Главное, что нужно помнить, это то, что анимация не выполняется последовательно, как вы могли ожидать, что код будет.
Код на основе блоков выглядит следующим образом. Обратите внимание, что я использую опцию автоповтора, которая автоматически повторяет анимацию. Обратите внимание, что в анимации вы устанавливаете свойство, поэтому по умолчанию после завершения анимации вид снова становится видимым. Поэтому в блоке завершения вы снова установите свойство равным нулю.
- (IBAction)animate {
[UIView transitionWithView:self.testView duration:3.0 options:UIViewAnimationOptionAutoreverse animations:^{self.testView.alpha = 1.0;} completion:^(BOOL finished) {self.testView.alpha = 0.0;}];
}
Надеюсь, это поможет!