Style de transition modale comme dans l'application Mail

J'essaie d'get un effet de présentation modale où la vue présentée ne couvre que partiellement la vue parent, comme le montre l'image ci-dessous.

entrez la description de l'image ici

Je sais que je pourrais y parvenir en implémentant des transitions personnalisées à l'aide de UIPresentationController . Je ne veux pas réinventer la roue, donc avant de continuer avec le développement, je voudrais requestr.

Y a-t-il une prise en charge de ce type de transition dans les API?

J'ai recherché tous les styles de présentation modale disponibles et il me semble qu'il n'y a pas de support pour la transition que je veux faire et la seule façon de l'atteindre est de le coder.

J'ai rencontré ce même problème. Je suis tombé sur la route des styles de présentation modale et j'ai continué à bash un mur (en particulier pour le faire fonctionner sur un iPhone plutôt que sur un iPad).

Après avoir creusé, j'ai réussi à le faire fonctionner. Voici comment je l'ai fait:

Pour commencer, nous avons besoin d'un controller de vue que nous allons présenter (le modal) pour définir la couleur d'arrière-plan de la vue sur transparent et définir le cadre de la vue du controller de navigation à un certain décalage.

ModalViewController.h

 @import UIKit; @class ModalViewController; @protocol ModalViewControllerDelegate <NSObject> - (void)modalViewControllerDidCancel:(ModalViewController *)modalViewController; @end @interface ModalViewController : UIViewController @property (weak, nonatomic) id<ModalViewControllerDelegate> delegate; - (instancetype)initWithRootViewController:(UIViewController *)rootViewController; @end 

ModalViewController.m

 static const CGFloat kTopOffset = 50.0f; @implementation ModalViewController { UINavigationController *_navController; } - (instancetype)initWithRootViewController:(UIViewController *)rootViewController { self = [super initWithNibName:nil bundle:nil]; if (self) { rootViewController.navigationItem.leftBarButtonItem = [self cancelButton]; _navController = [[UINavigationController alloc] initWithRootViewController:rootViewController]; self.view.backgroundColor = [UIColor clearColor]; [self.view addSubview:_navController.view]; // this is important (prevents black overlay) self.modalPresentationStyle = UIModalPresentationOverFullScreen; } return self; } - (void)viewDidLoad { [super viewDidLoad]; CGRect bounds = self.view.bounds; _navController.view.frame = CGRectMake(0, kTopOffset, CGRectGetWidth(bounds), CGRectGetHeight(bounds) - kTopOffset); } - (UIBarButtonItem *)cancelButton { return [[UIBarButtonItem alloc] initWithTitle:@"Cancel" style:UIBarButtonItemStylePlain target:self action:@selector(cancelButtonClicked:)]; } - (void)cancelButtonClicked:(id)sender { [_delegate modalViewControllerDidCancel:self]; } @end 

Ensuite, nous devons configurer le controller de présentation pour exécuter l'animation suivante:

  • S'échelle
  • Fade out un petit peu
  • Présenter le controller de vue modale en utilisant presentViewController:animated:completion

C'est ce que j'ai fait

PresentingViewController.m

 static const CGFloat kTransitionScale = 0.9f; static const CGFloat kTransitionAlpha = 0.6f; static const NSTimeInterval kTransitionDuration = 0.5; @interface PresentingViewController <ModalViewControllerDelegate> @end @implementation PresentingViewController ... ... - (void)showModalViewController { self.navigationController.view.layer.shouldRasterize = YES; self.navigationController.view.layer.rasterizationScale = [UIScreen mainScreen].scale; UIViewController *controller = // init some view controller ModalViewController *container = [[ModalViewController alloc] initWithRootViewController:controller]; container.delegate = self; __weak UIViewController *weakSelf = self; [UIView animateWithDuration:kTransitionDuration animations:^{ weakSelf.navigationController.view.transform = CGAffineTransformMakeScale(kTransitionScale, kTransitionScale); weakSelf.navigationController.view.alpha = kTransitionAlpha; [weakSelf presentViewController:container animated:YES completion:nil]; } completion:^(BOOL finished) { weakSelf.navigationController.view.layer.shouldRasterize = NO; }]; } #pragma mark - ModalViewControllerDelegate - (void)modalViewControllerDidCancel:(ModalViewController *)modalViewController { __weak UIViewController *weakSelf = self; [UIView animateWithDuration:kTransitionDuration animations:^{ weakSelf.navigationController.view.alpha = 1; weakSelf.navigationController.view.transform = CGAffineTransformIdentity; [weakSelf dismissViewControllerAnimated:YES completion:nil]; }]; } @end 

Je suis sûr que c'est votre réponse – Feuille de page – comme dans UIModalPresentationPageSheet

https://developer.apple.com/library/ios/documentation/userexperience/conceptual/mobilehig/Alerts.html#//apple_ref/doc/uid/TP40006556-CH14-SW3

assez sûr que c'est fait comme ça

 let newVC = <view controller you want to display> let nav: UINavigationController = UINavigationController(rootViewController: newVC) if let currVc = UIApplication.sharedApplication().keyWindow?.rootViewController { nav.transitioningDelegate = currVc nav.modalPresentationStyle = UIModalPresentationStyle.Custom; currVc.presentViewController(nav, animated: true, completion: nil) }