modalPresentationStyle formSheet issues on iphone XR, XS Max

Viewed 1547

I am displaying modal UIViewController with modalPresentationStyle = .formSheet but it has some issues on iphone XR and XS Max. It's displayed behind notch. Image bellow from left side iphone XR, XS, X.

enter image description here

UIViewController use autolayout and is presented like this:

let contentViewController = UINib(nibName: "EditViewController", bundle: nil).instantiate(withOwner: nil, options: nil)[0] as! EditViewController

let navController = UINavigationController(rootViewController: contentViewController)

navController.modalPresentationStyle = UIModalPresentationStyle.formSheet
let popover = navController.presentationController!
popover.delegate = self

self.present(navController, animated: true, completion: nil)

delegate:

extension MyController: UIAdaptivePresentationControllerDelegate {

    func adaptivePresentationStyle(for controller: UIPresentationController, traitCollection: UITraitCollection) -> UIModalPresentationStyle {
        return .none
    }
}

There is same issue with modalPresentationStyle = .pageSheet. It works fine with other modalPresentationStyles ie fullscreen

It's on iOS 12.1, swift 3

Any idea how to fix this? Thanks

2 Answers

UIKit does not support that.

The only possibilities are sheet to full screen and page sheet to form sheet on iPad. As specified in the documentation :

In a horizontally compact environment, this option behaves the same as UIModalPresentationFullScreen.

So UIKit already adapts it.

Unfortunately you will have to implement your own custom transition controller.

As GaétanZ said, better use another modal presentation style like overFullScreen for compact horizontal size clases and leave the formSheet for the horizontally regular ones.

func adaptivePresentationStyle(for controller: UIPresentationController) -> UIModalPresentationStyle {
    if controller.traitCollection.horizontalSizeClass == .regular {
        return .formSheet
    }
    return .overFullScreen
 }
Related