Ce code fonctionne bien sur l'iPhone sous iOS6 et iOS7 :
presentedVC.view.backgroundColor = YOUR_COLOR; // can be with 'alpha'
presentingVC.modalPresentationStyle = UIModalPresentationCurrentContext;
[presentingVC presentViewController:presentedVC animated:YES completion:NULL];
Dans ce cas, vous manquez l'animation slide-on. Pour conserver l'animation, vous pouvez toujours utiliser l'extension "non élégante" suivante :
[presentingVC presentViewController:presentedVC animated:YES completion:^{
[presentedVC dismissViewControllerAnimated:NO completion:^{
presentingVC.modalPresentationStyle = UIModalPresentationCurrentContext;
[presentingVC presentViewController:presentedVC animated:NO completion:NULL];
}];
}];
Si notre presentingV est situé à l'intérieur de UINavigationController ou UITabbarController, vous devez opérer avec ces contrôleurs en tant que presentingVC.
En outre, dans iOS7, vous pouvez mettre en œuvre une animation de transition personnalisée en appliquant les règles suivantes UIViewControllerTransitioningDelegate
protocole. Bien sûr, dans ce cas, vous pouvez obtenir un fond transparent
@interface ModalViewController : UIViewController <UIViewControllerTransitioningDelegate>
Tout d'abord, avant de présenter, vous devez définir modalPresentationStyle
modalViewController.modalPresentationStyle = UIModalPresentationCustom;
Vous devez ensuite mettre en œuvre deux méthodes de protocole
- (id<UIViewControllerAnimatedTransitioning>)animationControllerForPresentedController:(UIViewController *)presented presentingController:(UIViewController *)presenting sourceController:(UIViewController *)source
{
CustomAnimatedTransitioning *transitioning = [CustomAnimatedTransitioning new];
transitioning.presenting = YES;
return transitioning;
}
- (id<UIViewControllerAnimatedTransitioning>)animationControllerForDismissedController:(UIViewController *)dismissed
{
CustomAnimatedTransitioning * transitioning = [CustomAnimatedTransitioning new];
transitioning.presenting = NO;
return transitioning;
}
La dernière chose à faire est de définir votre transition personnalisée dans la section CustomAnimatedTransitioning
classe
@interface CustomAnimatedTransitioning : NSObject <UIViewControllerAnimatedTransitioning>
@property (nonatomic) BOOL presenting;
@end
@implementation CurrentContextTransitionAnimator
- (NSTimeInterval)transitionDuration:(id <UIViewControllerContextTransitioning>)transitionContext
{
return 0.25;
}
- (void)animateTransition:(id <UIViewControllerContextTransitioning>)transitionContext
{
UIViewController *fromViewController = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey];
UIViewController *toViewController = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey];
if (self.presenting) {
// custom presenting animation
}
else {
// custom dismissing animation
}
}