EDIT: Nouvelle réponse qui fonctionne dans n'importe quelle orientation.
La réponse d'origine ne fonctionne que lorsque l'interface est en orientation portrait. Il s'agit d'animations de transition de vue b / c qui remplacent une vue avec une vue différente doivent se produire avec des vues au moins un niveau en dessous de la première vue ajoutée à la fenêtre (par exemplewindow.rootViewController.view.anotherView
).
J'ai implémenté une classe de conteneur simple que j'ai appelée TransitionController
. Vous pouvez le trouver sur https://gist.github.com/1394947 .
En passant, je préfère l'implémentation dans une classe distincte b / c c'est plus facile à réutiliser. Si vous ne le souhaitez pas, vous pouvez simplement implémenter la même logique directement dans votre délégué d'application, éliminant ainsi le besoin de la TransitionController
classe. La logique dont vous auriez besoin serait cependant la même.
Utilisez-le comme suit:
Dans votre délégué d'application
// 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;
}
Pour passer à un nouveau contrôleur de vue à partir de n'importe quel contrôleur de vue
- (IBAction)flipToView
{
anotherViewController *vc = [[AnotherViewController alloc] init...];
MyAppDelegate *appDelegate = [UIApplication sharedApplication].delegate;
[appDelegate.transitionController transitionToViewController:vc withOptions:UIViewAnimationOptionTransitionFlipFromRight];
}
EDIT: Réponse originale ci-dessous - ne fonctionne que pour l'orientation du portrait
J'ai fait les hypothèses suivantes pour cet exemple:
Vous avez un contrôleur de vue affecté en tant que rootViewController
de votre fenêtre
Lorsque vous basculez vers une nouvelle vue, vous souhaitez remplacer le viewController actuel par le viewController propriétaire de la nouvelle vue. A tout moment, seul le viewController actuel est actif (par exemple alloué).
Le code peut être facilement modifié pour fonctionner différemment, le point clé est la transition animée et le contrôleur de vue unique. Assurez-vous de ne conserver aucun contrôleur de vue en dehors de son attribution window.rootViewController
.
Code pour animer la transition dans le délégué d'application
- (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;
}];
}
Exemple d'utilisation dans un contrôleur de vue
- (IBAction)flipToNextView
{
AnotherViewController *anotherVC = [[AnotherVC alloc] init...];
MyAppDelegate *appDelegate = (MyAppDelegate *)[UIApplication sharedApplication].delegate;
[appDelegate transitionToViewController:anotherVC
withTransition:UIViewAnimationOptionTransitionFlipFromRight];
}