How do you present a UIViewController from the top of the screen instead of the bottom?

后端 未结 5 2155
不思量自难忘°
不思量自难忘° 2021-01-03 13:10

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

相关标签:
5条回答
  • 2021-01-03 13:12
    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)
                                   }
                               })
            }
        }
    }
    
    0 讨论(0)
  • 2021-01-03 13:12

    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.

    0 讨论(0)
  • 2021-01-03 13:25

    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
    
    0 讨论(0)
  • 2021-01-03 13:34

    You have to #import the QuartzCore framework and add the transition animation, then change:

    animated:YES to: animated:NO.

    0 讨论(0)
  • 2021-01-03 13:35

    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.

    0 讨论(0)
提交回复
热议问题