I have code that enters full screen mode by hiding the UINavigationController's navigation bar. I want a smooth animated zooming effect when entering full screen. I use setNavigationBarHidden(_:animated:). This has all worked fine up to now, even on iOS 11, but on iPhone X the animation is not working well. On hiding, there is no animation and the nav bar just disappears. On unhiding, it does animate but the nav bar appears at a slower rate than the navigation controller's content area reduces, so an ugly black background shows through the navigation bar area during the animation.
I can recreate this in a simple test app. I have a UIViewController embedded in a UINavigationController.
Storyboard
- UINavigationController Navigation Bar: Style == Black; Translucent OFF
 - UIViewController: Extend Edges: all options OFF.
 
I have tried all the combinations of Adjust Scroll View Insets and Extend Edges that I can think of but they made no difference.
Code
override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    setFullScreen(on: fullScreen, animated: animated)
}
override var prefersStatusBarHidden: Bool
{
    return fullScreen
}
override var preferredStatusBarStyle: UIStatusBarStyle
{
    return .lightContent
}
@IBAction func onToggleNavBarVisibility(_ sender: Any) {
    if let navBarHidden = self.navigationController?.isNavigationBarHidden {
        // Toggle the state
        fullScreen = !navBarHidden
        setFullScreen(on: fullScreen, animated: true)
    }
}
private func setFullScreen(on : Bool, animated : Bool) {
    self.navigationController?.setNavigationBarHidden(on, animated: animated)
    self.setNeedsStatusBarAppearanceUpdate()
}

