I am using a UIViewController and I use presentModalViewController:controllerr animated:YES to present it but I would like if it would slide down from the top of the screen
public extension UINavigationController {
func pushViewControllerFromTop(viewController vc: UIViewController) {
vc.view.alpha = 0
self.present(vc, animated: false) { () -> Void in
vc.view.frame = CGRect(x: 0, y: -vc.view.frame.height, width: vc.view.frame.width, height: vc.view.frame.height)
vc.view.alpha = 1
UIView.animate(withDuration: 1,
animations: { () -> Void in
vc.view.frame = CGRect(x: 0, y: 0, width: vc.view.frame.width, height: vc.view.frame.height)
},
completion: nil)
}
}
func dismissViewControllerToTop() {
if let vc = self.presentedViewController {
UIView.animate(withDuration: 1,
animations: { () -> Void in
vc.view.frame = CGRect(x: 0, y: -vc.view.frame.height, width: vc.view.frame.width, height: vc.view.frame.height)
},
completion: { complete -> Void in
if complete {
self.dismiss(animated: false, completion: nil)
}
})
}
}
}
What you're describing isn't a built-in transition style; see here for a list of those that Apple provides. If you absolutely need your view controller to appear this way, you'll have to animate it yourself.
I created a function for pushing the ViewControllers
from all 4 directions:
- (void) slideLayerInDirection:(NSString *)direction andPush:(UIViewController *)dstVC {
CATransition* transition = [CATransition animation];
transition.duration = 0.5;
transition.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
transition.type = kCATransitionPush;
transition.subtype = direction;
[self.view.layer addAnimation:transition forKey:kCATransition];
[self pushViewController:dstVC animated:NO];
}
The header file contains the following:
#import <QuartzCore/QuartzCore.h>
#define direction_left kCATransitionFromLeft
#define direction_top kCATransitionFromBottom
#define direction_right kCATransitionFromRight
#define direction_bottom kCATransitionFromTop
You have to #import
the QuartzCore
framework and add the transition animation, then change:
animated:YES
to:
animated:NO
.
I use the following code to animate a viewController in from the top.
[self.mainViewController.view addSubview:modalViewController.view];
modalViewController.view.frame = CGRectMake(modalViewController.view.frame.origin.x,
-modalViewController.view.frame.size.height,
modalViewController.view.frame.size.width,
modalViewController.view.frame.size.height);
[UIView animateWithDuration:0.4 delay:0 options:UIViewAnimationOptionCurveEaseInOut animations:^(void){
modalViewController.view.frame = CGRectMake(modalViewController.view.frame.origin.x,
0,
modalViewController.view.frame.size.width,
modalViewController.view.frame.size.height);
} completion:^(BOOL finished){
[modalViewController.view removeFromSuperview];
[self.mainViewController presentViewController:modalViewController animated:NO completion:nil];
}];
It adds the UIView
of the modalViewController
to the mainViewController
, animates it in, then removes the UIView
from the mainViewController
and presentsViewController:
without animation.