Обычно:
Вы не должны делать анимацию в viewWillAppear
только в viewDidAppear
.Подготовьте свои данные, розетки и т. Д. Только в viewWillAppear
.
Также очень распространенный случай, когда может возникнуть wait_fences
, - это когда у вас есть анимированный диалог (например, MPMediaPickerController
)это приводит к появлению другого анимированного представления (например, пользовательского модального UIViewController
) и т. п., в этом случае вам необходимо «отложить» представление второго контроллера представления, например:
[self performSelector:@selector(showMyOtherViewController)
withObject:nil
afterDelay:0.1];
Также проверьте этот ответ https://stackoverflow.com/7194182.
Редактировать
Хороший способ "отладки" конфликтующих анимаций - просто установить анимацию на NO
, такв вашем коде вместо
[self presentModalViewController:mediaPicker animated:YES];
[self dismissModalViewControllerAnimated:YES];
Просто выполните:
[self presentModalViewController:mediaPicker animated:NO];
[self dismissModalViewControllerAnimated:NO];
и проверьте, исчезла ли ошибка wait_fences
и достигнуто ли правильное поведение (но без анимации).Если дело обстоит именно так, вам нужны некоторые из performSelector:withObject:afterDelay:
-магов.
Редактировать: Обратите внимание, что в iOS 5.0 вы можете делать следующее:
[self dismissViewControllerAnimated:YES completion:^{
[self presentViewController:anotherViewController animated:YES completion:NULL]
}
Это означает, что во-первых, представленный в настоящий момент View Controller (например, ModalViewController) отклоняется, и когда анимация завершается, вы можете вызвать другой блок.В этом случае показать еще UIViewController