web-dev-qa-db-fra.com

animation de transition presentViewController

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 ...

8
Subramanian Raj

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;
13
Ch0k0l8

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)
6
swiftBoy

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.  Segue Attributes Inspector

0
elarcoiris

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+.