首页 文章

setNavigationBarHidden动画在iPhone X上无法正常工作

提问于
浏览
1

我有通过隐藏UINavigationController的导航栏进入全屏模式的代码 . 进入全屏时,我想要一个平滑的动画缩放效果 . 我用setNavigationBarHidden(_:animated:) . 即使在iOS 11上,这一切都运行良好,但在iPhone X上,动画效果不佳 . 在隐藏时,没有动画,导航栏就会消失 . 在取消隐藏时,它会进行动画处理,但导航栏的显示速度比导航控制器的内容区域减少的速度慢,因此在动画期间会通过导航栏区域显示丑陋的黑色背景 .

我可以在一个简单的测试应用程序中重新创建它 . 我有一个嵌入在UINavigationController中的UIViewController .

故事板

  • UINavigationController导航栏:Style == Black;半透明OFF

  • UIViewController:Extend Edges:所有选项OFF .

我已经尝试了我能想到的调整滚动视图插入和扩展边缘的所有组合,但它们没有任何区别 .

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

Result on iPhone X (slow animations)

1 回答

  • 2

    在您的情况下,您同时使用 barTintColornavigationBarStyleShow Hide 动画 . barTintColor overrides the value implied by the Style attribute 您应该选择 barTintColornavigationBarStyle 在下面的代码中我刚刚使用 barTintColor &navigationBarStyle是默认的 Transulent .

    enter image description here

    var fullScreen = false{
          didSet{
            self.setNeedsStatusBarAppearanceUpdate()
         }
       }
        override func viewDidLoad() {
            super.viewDidLoad()
            title = "Navigation Bar"
            navigationController?.navigationBar.barTintColor = .red
        }
        override func viewWillAppear(_ animated: Bool) {
            super.viewWillAppear(true)
            setFullScreen(on: fullScreen, animated: animated)
        }
        @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()
        }
    

    EDIT: 如果要隐藏状态栏,请使用带有bool值的 prefersStatusBarHidden . 并使用 setNeedsStatusBarAppearanceUpdate

    override var prefersStatusBarHidden: Bool {
            return fullScreen
        }
    

    https://developer.apple.com/documentation/uikit/uinavigationbar

相关问题