I have created a custom transition animation for a modal view controller by implementing the methods in the UIViewControllerTransitioningDelegate
protocol.
In iOS 8 and 9 the methods are called normally and the transition works. However, in iOS 7, the animationControllerForPresentedController:presentingController:sourceController:
method never gets called. The animationControllerForDismissedController:
method still gets called normally.
#import "MyModalTransitioningDelegate.h"
#import "MyModalFadeTransition.h"
@implementation MyModalTransitioningDelegate
- (id<UIViewControllerAnimatedTransitioning>)animationControllerForPresentedController:(UIViewController *)presented
presentingController:(UIViewController *)presenting
sourceController:(UIViewController *)source
{
return [[MyModalFadeTransition alloc] init];
}
- (id<UIViewControllerAnimatedTransitioning>)animationControllerForDismissedController:(UIViewController *)dismissed
{
return [[MyModalFadeTransition alloc] init];
}
@end
In the modal view controller (i.e. the "presented controller") I have the following in its -viewDidLoad
method:
self.modalTransitionDelegate = [[OTModalTransitioningDelegate alloc] init]; // This is a custom strong private property due to `tranisitioningDelegate` being a weak property.
self.transitioningDelegate = self.modalTransitionDelegate;
self.modalPresentationStyle = UIModalPresentationCustom;
Setting the modalPresentationStyle
doesn't seem to make any difference in any version of iOS. The method that isn't being called does say that it's available in iOS 7 so I'm not sure why it isn't being called.
The modal view controller is being presented with the following code in the presenting view controller:
[self presentViewController:self.modalViewController
animated:YES
completion:nil];
See Question&Answers more detail:os