简体   繁体   中英

Wrong position of rightBarButtonItem in iOS 10

I want to put the view of a UINavigationController into another view controller's view . The problem is that the right bar button is misplaced on iOS 10. On iOS 8 and 9 it looks good.

iOS 8 and 9:

在此输入图像描述

iOS 10:

在此输入图像描述

Here's 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)
    )
}

Also there are no clipped views (except the button itself). See snapshot of IB Debug View Hierachy:

在此输入图像描述

Any ideas?

I solved the problem by forwarding the viewWillAppear and viewDidAppear events to the navigation controller's root view 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)
}

This is happening because you're adding the subviews in the ViewDidLoad and not 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)
}

to this:

    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)

      }
 }

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM