EDIT : Nouvelle réponse qui fonctionne dans n'importe quelle orientation. La réponse originale ne fonctionne que lorsque l'interface est en orientation portrait. En effet, les animations de transition de vue qui remplacent une vue par une autre doivent se produire avec des vues situées au moins un niveau en dessous de la première vue ajoutée à la fenêtre (par ex. window.rootViewController.view.anotherView
).
J'ai implémenté une classe conteneur simple que j'ai appelée TransitionController
. Vous pouvez le trouver à l'adresse suivante https://gist.github.com/1394947 .
Par ailleurs, je préfère l'implémentation dans une classe séparée car elle est plus facile à réutiliser. Si vous ne voulez pas cela, vous pouvez simplement implémenter la même logique directement dans votre délégué d'application, éliminant ainsi la nécessité de la classe 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 assigné en tant que rootViewController
de votre fenêtre
-
Lorsque vous passez à une nouvelle vue, vous souhaitez remplacer le viewController actuel par le viewController appartenant à la nouvelle vue. À tout moment, seul le viewController actuel est vivant (c'est-à-dire 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 que vous ne conservez pas de contrôleur de vue ailleurs que dans l'assignation à window.rootViewController
.
Code pour animer la transition dans le délégué de l'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];
}
1 votes
Vous pouvez réaliser des transitions d'animation personnalisées avec un contrôleur de navigation. Si cela vous convient, veuillez supprimer cette contrainte de votre question et je publierai un exemple de code.
0 votes
@Richard si cela évite les tracas de la gestion de la pile et permet différents styles de transition animée entre les contrôleurs de vue, alors l'utilisation du contrôleur de navigation est parfaite !
0 votes
Ok bien. Je me suis impatienté et j'ai posté le code. Essayez-le. Ca marche pour moi.
0 votes
@RichardBrightwell vous avez dit ici que l'on pouvait faire des transitions d'animation personnalisées entre les contrôleurs de vue en utilisant un contrôleur de navigation... comment ? Pouvez-vous poster un exemple ? Merci.