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:
iOS 10:
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:
Any ideas?
source to share
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)
}
source to share
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)
}
}
source to share