Dans mon code, j'utilise presentViewController pour appeler mon deuxième contrôleur de vue.
[self presentViewController:secondController animated:YES completion:nil];
Lorsque j'appelle, je dois afficher l'animation de gauche à droite (comme dans navigationController).
Je ne veux pas utiliser le navigationController mais j'ai besoin d'une animation similaire à navigationController dans presentViewController ...
Ajoutez cette ligne de code avant de présenter le contrôleur de vue
secondController.modalTransitionStyle = UIModalTransitionStyleCrossDissolve;
secondController.modalPresentationStyle = UIModalPresentationFullScreen;
// Take a look at this enum
typedef enum {
UIModalTransitionStyleCoverVertical = 0,
UIModalTransitionStyleFlipHorizontal,
UIModalTransitionStyleCrossDissolve,
UIModalTransitionStylePartialCurl,
} UIModalTransitionStyle;
pour Swift
Définir les types d'animations
enum UIModalTransitionStyle : Int {
case CoverVertical = 0
case FlipHorizontal
case CrossDissolve
case PartialCurl
}
Comment utiliser
let vc : PageHomeViewController = storyboard!.instantiateViewControllerWithIdentifier("PageHomeViewController") as! PageHomeViewController
vc.modalTransitionStyle = .FlipHorizontal
self.presentViewController(vc, animated: true, completion: nil)
Tout ce qui précède peut également être réalisé dans le storyboard sans avoir à écrire de code. Cliquez sur votre segment qui relie vos contrôleurs de vue, puis sélectionnez l'onglet Inspecteur d'attributs dans le menu de droite. Dans le menu déroulant Kind, sélectionnez 'Present Modally'. Une autre série d’options apparaîtra. Dans le menu déroulant Transition, vous pourrez sélectionner l’un des énumérations ci-dessus.
Ma décision de résoudre l'animation "cover horizontal" comme une méthode Push UINavigationViewController avec l'utilisation de UIViewControllerTransitioningDelegate.
1.Créez une transition personnalisée.
Entête
@interface CoverHorizontalTransition: NSObject<UIViewControllerAnimatedTransitioning>
@property (assign, nonatomic) BOOL dismiss;
@end
La mise en oeuvre
@implementation CoverHorizontalTransition
- (void)animateTransition:(nonnull id<UIViewControllerContextTransitioning>)transitionContext
{
UIViewController *fromViewController;
fromViewController =
[transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey];
UIViewController *toViewController;
toViewController =
[transitionContext viewControllerForKey:UITransitionContextToViewControllerKey];
UIView *containerView = transitionContext.containerView;
CGRect animatedViewFrame;
animatedViewFrame = containerView.bounds;
animatedViewFrame.Origin = CGPointMake(CGRectGetWidth(animatedViewFrame), 0);
[containerView addSubview:toViewController.view];
if (_dismiss) {
[containerView bringSubviewToFront:fromViewController.view];
[UIView
animateWithDuration:[self transitionDuration:transitionContext]
animations:^{
fromViewController.view.frame = animatedViewFrame;
} completion:^(BOOL finished) {
[containerView.superview addSubview:toViewController.view];
[fromViewController.view removeFromSuperview];
[transitionContext completeTransition:YES];
}];
} else {
toViewController.view.frame = animatedViewFrame;
[UIView
animateWithDuration:[self transitionDuration:transitionContext]
animations:^{
toViewController.view.center = containerView.center;
} completion:^(BOOL finished) {
[transitionContext completeTransition:YES];
}];
}
}
- (NSTimeInterval)transitionDuration:(nullable id<UIViewControllerContextTransitioning>)transitionContext
{
return 0.25;
}
@end
2.Créez un délégué de transition.
@implementation CustomViewControllerTransitioningDelegate
- (id<UIViewControllerAnimatedTransitioning>)animationControllerForPresentedController:(UIViewController *)presented presentingController:(UIViewController *)presenting sourceController:(UIViewController *)source
{
return [CoverHorizontalTransition new];
}
- (id<UIViewControllerAnimatedTransitioning>)animationControllerForDismissedController:(UIViewController *)dismissed
{
CoverHorizontalTransition *transition;
transition = [CoverHorizontalTransition new];
transition.dismiss = YES;
return transition;
}
@end
Exemple d'utilisation.
...
// Save delegate to strong property
secondController.customTransitioningDelegate =
[BaseViewControllerTransitioningDelegate new];
secondController.transitioningDelegate =
secondController.customTransitioningDelegate;
secondController.modalPresentationStyle = UIModalPresentationCustom;
[self presentViewController:secondController animated:YES completion:nil];
Ce code fonctionne pour iOS 10+.