EDIT: Нова відповідь, яка працює в будь-якій орієнтації.
Оригінальна відповідь працює лише тоді, коли інтерфейс знаходиться в портретній орієнтації. Це анімації переходу b / c перегляду, які замінюють представлення без іншого вигляду, мають відбуватися з представленнями принаймні на рівні нижче першого перегляду, доданого до вікна (наприкладwindow.rootViewController.view.anotherView
).
Я реалізував простий клас контейнерів, який я назвав TransitionController
. Ви можете знайти його за посиланням https://gist.github.com/1394947 .
Як осторонь, я вважаю за краще реалізацію в окремому класі, які простіше використовувати. Якщо ви цього не хочете, ви можете просто реалізувати ту саму логіку безпосередньо в делеґаті додатка, усуваючи потребу в TransitionController
класі. Логіка, яка вам потрібна, буде однаковою.
Використовуйте його наступним чином:
У делегата програми
// add a property for the TransitionController
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
MyViewController *vc = [[MyViewContoller alloc] init...];
self.transitionController = [[TransitionController alloc] initWithViewController:vc];
self.window.rootViewController = self.transitionController;
[self.window makeKeyAndVisible];
return YES;
}
Для переходу на новий контролер перегляду з будь-якого контролера перегляду
- (IBAction)flipToView
{
anotherViewController *vc = [[AnotherViewController alloc] init...];
MyAppDelegate *appDelegate = [UIApplication sharedApplication].delegate;
[appDelegate.transitionController transitionToViewController:vc withOptions:UIViewAnimationOptionTransitionFlipFromRight];
}
EDIT: Оригінальний відповідь нижче - працює лише для орієнтації на портати
Я зробив наступні припущення для цього прикладу:
У rootViewController
вашому вікні призначений контролер перегляду
Коли ви переходите на новий вид, ви хочете замінити поточний вигляд Контролера на viewController, що володіє новим поданням. У будь-який час живий лише поточний вигляд Контролера (наприклад, виділено).
Код можна легко змінити, щоб він працював по-різному, ключовим моментом є анімований перехід і контролер єдиного перегляду. Переконайтеся, що ви не зберігаєте контролер перегляду в будь-якому місці поза його призначенням window.rootViewController
.
Код, щоб анімувати перехід у делегаті програми
- (void)transitionToViewController:(UIViewController *)viewController
withTransition:(UIViewAnimationOptions)transition
{
[UIView transitionFromView:self.window.rootViewController.view
toView:viewController.view
duration:0.65f
options:transition
completion:^(BOOL finished){
self.window.rootViewController = viewController;
}];
}
Приклад використання в контролері перегляду
- (IBAction)flipToNextView
{
AnotherViewController *anotherVC = [[AnotherVC alloc] init...];
MyAppDelegate *appDelegate = (MyAppDelegate *)[UIApplication sharedApplication].delegate;
[appDelegate transitionToViewController:anotherVC
withTransition:UIViewAnimationOptionTransitionFlipFromRight];
}