Как закончить анимацию в Cocoa Touch раньше? - PullRequest
0 голосов
/ 09 августа 2009

У меня есть UINavigationController, на который я помещаю «загрузочный экран» UIViewController, когда я асинхронно подключаюсь к серверу. Толчок неявно оживляется с этим эффектом скольжения. Если во время подключения возникает ошибка, я вынимаю контроллер экрана загрузки (снова анимированный) и отображаю предупреждение для пользователя.

Все хорошо, если я выталкиваю контроллер вида после завершения анимации, однако, если анимация еще не завершена, происходят странные вещи. Обычно экран загрузки остается на экране, даже если он был извлечен из стека навигационных контроллеров. Я почти уверен, что проблема связана с анимацией. Например, этот придуманный фрагмент кода всегда оставляет для меня представление secondController на экране:

[navController pushViewController: secondController animated: YES];
[navController popToRootViewControllerAnimated: YES];
NSAssert([delegate.navigationController.viewControllers count] == 1, @"oops");

Мой текущий обходной путь - зарегистрировать делегата в контроллере навигации и реализовать navigationController: didShowViewController: animated: метод. Затем я выскакиваю только на экране контроллера загрузки, когда знаю, что первая анимация нажатия завершена. Однако я предпочел бы просто закончить анимацию рано.

Я попытался вызвать removeAllAnimations на всех слоях в дереве слоев для всех вложенных видов представления контроллера навигации. Несмотря на то, что этот подход завершил анимацию на ранней стадии, он все еще часто оставлял изображение экрана загрузки по-прежнему на дисплее после того, как оно появилось. Так в принципе, есть ли правильный способ закончить анимацию рано, или я должен просто продолжать свою работу?

Ответы [ 2 ]

0 голосов
/ 10 августа 2009

Полностью не проверено, но вы пытались удалить все анимации из основного слоя анимации представления ваших контроллеров представления?

[[[secondController view] layer] removeAllAnimations];
0 голосов
/ 09 августа 2009

Трудно понять, почему вы захотите получить доступ к корневому контроллеру представления сразу после его нажатия, но когда мне пришлось делать подобные вещи, я позволяю выдвигаемому контроллеру представления определять, нужно ли ему выдвигать или не. Поэтому в -viewDidLoad вашего secondController определите, верно ли ваше условие для обращения к корневому представлению. Если это так, то оттуда звоните по телефону

[[self navigationController] popViewControllerAnimated:YES];

Кроме того, не так, что это решит вашу проблему, но вы можете подумать о том, чтобы нажать «загрузочный экран» с -presentModalViewController вместо этого:

- (void)presentModalViewController:(UIViewController *)modalViewController animated:(BOOL)animated

и это поп-эквивалент:

- (void)dismissModalViewControllerAnimated:(BOOL)animated
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...