Wrong position of rightBarButtonItem in iOS 10

I want to put view

from UINavigationController

to another view controller view

. The problem is that the right bar button is out of place on iOS 10. On iOS 8 and 9, it looks good.

iOS 8 and 9:

enter image description here

iOS 10:

enter image description here

Here is the code how I add the navigation controller:

override func viewDidLoad() {
    super.viewDidLoad()

    let viewController = MyViewController()
    navController = UINavigationController(rootViewController: viewController)
    navController.willMove(toParentViewController: self)
    addChildViewController(navController)
    navController.view.frame = view.bounds
    view.addSubview(navController.view)
    navController.didMove(toParentViewController: self)
}

      

In MyViewController

override func viewDidLoad() {
    super.viewDidLoad()

    navigationItem.rightBarButtonItem = UIBarButtonItem(
        barButtonSystemItem: .done,
        target: self,
        action: #selector(doneButtonPressed)
    )
}

      

There are also no clipped views (other than the button itself). See Snapshot IB Debug View Hierachy:

enter image description here

Any ideas?

+3


source to share


2 answers


I solved the problem by forwarding the event viewWillAppear

and viewDidAppear

the controller of the root controller navigation controller.



override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)

    navController.viewControllers.first?.viewWillAppear(animated)
}

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)

    navController.viewControllers.first?.viewDidAppear(animated)
}

      

+2


source


This is because you are adding subviews to the ViewDidLoad and not the viewDidAppear, try changing this:

override func viewDidLoad() {
    super.viewDidLoad()


    let viewController = MyViewController()
    navController = UINavigationController(rootViewController: viewController)
    navController.willMove(toParentViewController: self)
    addChildViewController(navController)
    navController.view.frame = view.bounds
    view.addSubview(navController.view)
    navController.didMove(toParentViewController: self)
}

      



:

    let viewController = MyViewController()

    override func viewDidAppear() {
        super.viewDidAppear()
     if(self.childViewControllers.contains(viewController) != true){
        navController = UINavigationController(rootViewController: viewController)
        navController.willMove(toParentViewController: self)
        addChildViewController(navController)
        navController.view.frame = view.bounds
        view.addSubview(navController.view)
        navController.didMove(toParentViewController: self)

      }
 }

      

0


source







All Articles