5

Safe Area Insets in ersten UIViewController ändert sich in Safe Area Inset für Landschaft, wenn ich SecondViewController, die nur Querformat-Ausrichtung unterstützt präsentieren.Sichere Bereich ändert sich in übergeordneten VC beim Anzeigen von modal VC in Querformat

GIF with described bug

GIF with described bug that touches TabBar and TableView

FirstViewController:

class ViewController: UIViewController { 

    @IBAction func showSecondVC(_ sender: Any) { 
    let storyboard = UIStoryboard(name: "Main", bundle: nil) 
    let controller = storyboard.instantiateViewController(withIdentifier: "SecondViewController") 

    self.present(controller, animated: true, completion: { 
     print("completed") 
    }) 
    } 

    override func viewSafeAreaInsetsDidChange() { 
    print(view.safeAreaInsets) 
    super.viewSafeAreaInsetsDidChange() 
    print(view.safeAreaInsets) 
    } 
} 

Second Viewcontroller:

class SecondViewController: UIViewController { 
    override var supportedInterfaceOrientations: UIInterfaceOrientationMask { 
    return [.landscape] 
    } 

    @IBAction func dismissYourSelff(_ sender: Any) { 
    self.dismiss(animated: true, completion: nil) 
    } 
} 

Console Ausgabe:

UIEdgeInsets(top: 44.0, left: 0.0, bottom: 34.0, right: 0.0) 
UIEdgeInsets(top: 44.0, left: 0.0, bottom: 34.0, right: 0.0) 
UIEdgeInsets(top: 0.0, left: 44.0, bottom: 21.0, right: 44.0) 
UIEdgeInsets(top: 0.0, left: 44.0, bottom: 21.0, right: 44.0) 
completed 

Antwort

0

Das ist, wie ich das Problem mit Nebenbedingungen gelöst: https://gist.github.com/filletofish/b56600e9e661aa6e49cc0a56a98b37a3

Ich hatte Schnappschüsse zu verwenden falsches Layout TabBar und Tableview zu verhindern.

override func present(_ viewControllerToPresent: UIViewController, animated flag: Bool, completion: (() -> Void)? = nil) { 
    var completionToRemoveSnapshot: (() ->())? = nil 

    let shouldUseSnapshot = SDiOSVersion.deviceSize() == .Screen5Dot8inch && 
     viewControllerToPresent.supportedInterfaceOrientations == .landscape 

    if shouldUseSnapshot { 
     if let snapShot = self.view.snapshotView(afterScreenUpdates: true) { 
     viewController.view.addSubview(snapShot) 
     completionToRemoveSnapshot = { snapShot.removeFromSuperview() } 
     } 
    } 

    super.present(viewControllerToPresent, animated: flag, completion: { 
     completionToRemoveSnapshot?() 
     completion?() 
    }) 
    }