РЕДАКТИРОВАТЬ: Новый ответ, который работает в любой ориентации. Оригинальный ответ работает только тогда, когда интерфейс находится в портретной ориентации.Это анимация перехода вида b / c, которая заменяет вид, иначе должен быть вид, при котором представления, по крайней мере, на уровне ниже первого, добавленного в окно (например, window.rootViewController.view.anotherView
).
Я реализовалпростой контейнерный класс, который я назвал TransitionController
.Вы можете найти его по адресу https://gist.github.com/1394947.
Кроме того, я предпочитаю реализацию в отдельном классе b / c, которую проще использовать повторно.Если вы этого не хотите, вы можете просто реализовать ту же логику непосредственно в делегате приложения, устраняя необходимость в классе 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];
}
РЕДАКТИРОВАТЬ: оригинальный ответ ниже - работает только для ориентации портрета
Я сделал следующие предположения для этого примера:
У вас есть контроллер вида, назначенный как rootViewController
вашего окна
Когда вы переключаетесь на новое представление, вы хотите заменить текущий viewController на viewController, которому принадлежит новое представление.В любое время активен только текущий viewController (например, alloc'ed).
Код может быть легко изменен для работы по-другому, ключевой момент - анимированный переход и единое представлениеконтроллер.Убедитесь, что вы не сохраняете контроллер представления нигде, кроме того, чтобы назначить его 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];
}