Swift iOS - 即使我隐藏它,导航栏也不会保持隐藏状态

Posted

技术标签:

【中文标题】Swift iOS - 即使我隐藏它,导航栏也不会保持隐藏状态【英文标题】:Swift iOS -Navigation Bar won't stay Hidden even though I'm hiding it 【发布时间】:2018-03-09 00:22:21 【问题描述】:

一切都以编程方式发生。没有 Storyboard 和集合视图的 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)

详细的VC:

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...

【问题讨论】:

是否有导航控制器作为父 DetailController @HarshalBhavsar 是的。集合视图使用 didSelectItem 中的导航控制器推动它 所以集合视图被嵌入到导航控制器中 @HarshalBhavsar 这是它能够使用 navigationController?.pushViewController 的唯一方法...如果集合视图不在导航控制器中,那将如何工作? 好的,所以在推送之前尝试隐藏导航栏。在 didSelectItem 中 【参考方案1】:

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

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

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 中将其设置为false 时,导航栏将显示在父vc 中(集合视图) 导航栏没有出现在那里。

【讨论】:

我已经搞砸了好几天,lmao,很高兴能帮上忙。干杯!!

以上是关于Swift iOS - 即使我隐藏它,导航栏也不会保持隐藏状态的主要内容,如果未能解决你的问题,请参考以下文章

Swift ios导航栏在被滚动隐藏后不会出现

UINavigationBar变成白色,在iOS 13中使用navigationItem.searchController时不会关闭

隐藏导航栏时隐藏状态栏 - SWIFT iOS8

隐藏 iOS 导航栏中的所有内容,包括图标

用户滚动时隐藏导航栏

Uiwebview 用 Swift 隐藏/显示 UInavigationbar