Presenting modal in iOS 13 fullscreen

后端 未结 30 2091
囚心锁ツ
囚心锁ツ 2020-11-21 06:48

In iOS 13 there is a new behaviour for modal view controller when being presented.

Now it\'s not fullscreen by default and when I try to slide down, the app just dis

相关标签:
30条回答
  • 2020-11-21 07:15

    Here's my version of fix in ObjectiveC using Categories. With this approach you'll have default UIModalPresentationStyleFullScreen behaviour until another one explicitly set.

    #import "UIViewController+Presentation.h"
    #import "objc/runtime.h"
    
    @implementation UIViewController (Presentation)
    
    - (void)setModalPresentationStyle:(UIModalPresentationStyle)modalPresentationStyle {
        [self setPrivateModalPresentationStyle:modalPresentationStyle];
    }
    
    -(UIModalPresentationStyle)modalPresentationStyle {
        UIModalPresentationStyle style = [self privateModalPresentationStyle];
        if (style == NSNotFound) {
            return UIModalPresentationFullScreen;
        }
        return style;
    }
    
    - (void)setPrivateModalPresentationStyle:(UIModalPresentationStyle)modalPresentationStyle {
        NSNumber *styleNumber = [NSNumber numberWithInteger:modalPresentationStyle];
         objc_setAssociatedObject(self, @selector(privateModalPresentationStyle), styleNumber, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
    }
    
    - (UIModalPresentationStyle)privateModalPresentationStyle {
        NSNumber *styleNumber = objc_getAssociatedObject(self, @selector(privateModalPresentationStyle));
        if (styleNumber == nil) {
            return NSNotFound;
        }
        return styleNumber.integerValue;
    }
    
    @end
    
    0 讨论(0)
  • 2020-11-21 07:19

    Latest for iOS 13 and Swift 5.x

    let vc = ViewController(nibName: "ViewController", bundle: nil)
    

    vc.modalPresentationStyle = .fullScreen

    self.present(vc, animated: true, completion: nil)
    
    0 讨论(0)
  • 2020-11-21 07:19

    The above answers and suggestions are right, below is another version, and efficient way using programmatically.

    #1 Created a UIView Extension

    #2 Created a Method ()

    //#1
    extension UIViewController {
    
    //#2
    func presentLocal(_ viewControllerToPresent: UIViewController, animated flag: 
    Bool, completion: (() -> Void)? = nil) {
    
    //Reusing below 2 lines :-)
    viewControllerToPresent.modalPresentationStyle = .overCurrentContext
    self.present(viewControllerToPresent, animated: flag, completion: completion)
    
      }
    }
    

    Invoking as below

    let vc = MyViewController()
    let nc = UINavigationController(rootViewController: vc)
    sourceView.presentLocal(nc, animated: true, completion: nil)
    

    OR

    let vc = MyViewController()
    sourceView.presentLocal(vc, animated: true, completion: nil)
    
    0 讨论(0)
  • 2020-11-21 07:20
    let Obj = MtViewController()
    Obj.modalPresentationStyle = .overFullScreen
    self.present(Obj, animated: true, completion: nil)
    

    // if you want to disable swipe to dismiss on it, add line

    Obj.isModalInPresentation = true
    

    Check Apple Document for More info.

    0 讨论(0)
  • 2020-11-21 07:20

    The simplest solution that worked for me.

    viewController.modalPresentationStyle = .fullScreen
    
    0 讨论(0)
  • 2020-11-21 07:22

    As a hint: If you call present to a ViewController which is embedded inside a NavigationController you have to set the NavigationController to .fullScreen and not the VC.

    You can do this like @davidbates or you do it programmatically (like @pascalbros).

    The same applies to the UITabViewController

    An example scenario for NavigationController:

        //BaseNavigationController: UINavigationController {}
        let baseNavigationController = storyboard!.instantiateViewController(withIdentifier: "BaseNavigationController")
        var navigationController = UINavigationController(rootViewController: baseNavigationController)
        navigationController.modalPresentationStyle = .fullScreen
        navigationController.topViewController as? LoginViewController
        self.present(navigationViewController, animated: true, completion: nil)
    
    0 讨论(0)
提交回复
热议问题