2017-11-10 65 views
5

Wstawki obszaru bezpiecznego w pierwszym interfejsie UIViewController zmieniają się na obszar bezpieczny dla krajobrazu, gdy przedstawiam sterownik SecondViewController, który obsługuje tylko orientację poziomą.Zmiany w obszarze bezpiecznym w nadrzędnym polu VC podczas prezentacji modalnie VC w krajobrazie

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) 
    } 
} 

drugie ViewController:

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

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

Console wyjście:

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 

Odpowiedz

0

Tak właśnie rozwiązał problem z ograniczeniami: https://gist.github.com/filletofish/b56600e9e661aa6e49cc0a56a98b37a3

musiałem użyć migawki, aby zapobiec niewłaściwy układ umieszczenie zakładek i Tableview.

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?() 
    }) 
    }