即使我隐藏它,Swift iOS -Navigation Bar也不会保持隐藏状态

时间:2018-03-09 00:22:22

标签: ios swift uiviewcontroller uinavigationcontroller uinavigationbar

一切都以编程方式发生。没有故事板和集合视图的vc和详细的vc都在TabBarController中。

我正在使用集合视图,当我点击didSelectItem中的单元格时,我会推送一个详细的视图控制器。在DetailedVC中,我隐藏了导航控制器。我在viewDidLoadviewWillAppear中单独和累计地调用了下面的内容,试图将其隐藏起来:

navigationController?.isNavigationBarHidden = true
navigationController?.navigationBar.isHidden = true
navigationController?.setNavigationBarHidden(true, animated: false)

当场景首次出现时,导航栏将被隐藏。问题是当我在DetailedVC上向下滑动时,导航栏从屏幕顶部向下滑动并且不会消失。我错误地向下滑了发现它。

我按下导航栏的后退按钮,即使应该隐藏它也能正常工作。我隐藏它的原因是因为我有一个视频播放在DetailedVC的顶部,所以我使用自定义按钮弹回到集合视图。我也隐藏了状态栏(类似于YouTube),但它仍处于隐藏状态。

DetailedVC是一个常规视图控制器,它不包含表视图或集合视图,所以我很困惑为什么它让我向下滑动以及为什么导航栏不会保持隐藏?

推送DetailedVC的集合视图单元格:

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
        let detailVC = DetailController()
        navigationController?.pushViewController(detailVC, animated: true)
}

DetailedVC:

class DetailController: UIViewController {


    let customButton: UIButton = {
        let button = UIButton(type: .system)
        button.translatesAutoresizingMaskIntoConstraints = false
        button.setTitle("< Back", for: .normal)
        button.setTitleColor(UIColor.orange, for: .normal)
        button.addTarget(self, action: #selector(handleCustomButton), for: .touchUpInside)
        return button
     }()

override func viewDidLoad() {
        super.viewDidLoad()

        view.backgroundColor = .white
}

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

        UIApplication.shared.isStatusBarHidden = true

        // I tried all of these individually and cumulatively and the nav still shows when I swipe down
        navigationController?.isNavigationBarHidden = true
        navigationController?.navigationBar.isHidden = true
        navigationController?.setNavigationBarHidden(true, animated: false)
}

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

        UIApplication.shared.isStatusBarHidden = false
}

@objc fileprivate func handleCustomButton()
        navigationController?.popViewController(animated: true)
}

@objc fileprivate func configureButtonAnchors()
        //customButton.leftAnchor...
}

1 个答案:

答案 0 :(得分:3)

我不确定为什么当我在DetailVC内部向下滑动时导航栏被取消隐藏但我移动代码将其隐藏在viewDidLayoutSubviews中,现在它保持隐藏状态。

要解决我使用navigationController?.setNavigationBarHidden(true, animated: false)的问题并将其设置在viewWillLayoutSubviews

override func viewDidLayoutSubviews() {
        super.viewDidLayoutSubviews()

        // this one worked the best
        navigationController?.setNavigationBarHidden(true, animated: false)
}

并设置它以便它可以显示在前一个vc中,这将是集合视图:

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

        navigationController?.setNavigationBarHidden(false, animated: false)
}

我说它工作得最好,因为我分别尝试了所有3个而且3 navigationController?.navigationBar.isHidden = true都是错误的。出于某些原因,即使在viewDidLayoutSubviews中,即使导航栏没有重新出现,它也会使DetailedVC上下颠簸。

并且navigationController?.isNavigationBarHidden = true在DetailedVC内部工作,导航栏保持隐藏状态并且场景没有反弹但是当我在viewWillDisappear中将其设置为假时,导航条将显示在父vc(集合视图)导航栏没有出现在那里。