Swift iOS -NavigationBar hidesBarsOnSwipe 在状态栏下设置 CollectionView Frame 时永远不会重新出现

Posted

技术标签:

【中文标题】Swift iOS -NavigationBar hidesBarsOnSwipe 在状态栏下设置 CollectionView Frame 时永远不会重新出现【英文标题】:Swift iOS -NavigationBar hidesBarsOnSwipe never reappears when setting CollectionView Frame under Status Bar 【发布时间】:2018-08-11 20:51:35 【问题描述】:

我在 NavigationController 中有一个带有程序化 CollectionView 的 tabBar。我注意到向上滑动 CollectionView 单元格时会显示在状态栏下。为了解决这个问题,当我为 CollectionView 配置框架时,我使用了view.frame.origin.y + 20,其中20 是状态栏的高度。我这样做的原因是因为我使用了view.frame.size.height - tabBarController?.tabBar.frame.size.height 来防止单元格显示在 tabBar 下方并且它起作用了。

我还想在滑动时隐藏导航栏,所以在 ViewDidLoad 中我设置了navigationController?.hidesBarsOnSwipe = true

问题是当向上滑动导航栏时,滑动时隐藏并且单元格不再显示在状态栏下方但向下滑动时导航栏永远不会回来。为什么会这样?

代码:

override func viewDidLoad() 
        super.viewDidLoad()

        view.backgroundColor = UIColor.white
        navigationItem.title = "Home"

        navigationController?.hidesBarsOnSwipe = true

        configureCollectionView()


func configureCollectionView()

        let frame = CGRect(x: view.frame.origin.x,
                       y: view.frame.origin.y + 20, // here is where I add + 20 for the statusBar's height
                       width: view.frame.size.width,
                       height: view.frame.size.height - tabBarController!.tabBar.frame.size.height) // here is where I subtracted the tabBar's height (- 49)

        let layout = UICollectionViewFlowLayout()
        layout.sectionInset = UIEdgeInsetsMake(0, 0, 0, 0)

        collectionView = UICollectionView(frame: frame, collectionViewLayout: layout)
        collectionView.dataSource = self
        collectionView.delegate = self
        collectionView.backgroundColor = UIColor.white
        collectionView.alwaysBounceVertical = true
        collectionView.showsVerticalScrollIndicator = false
        collectionView.register(HomeCell.self, forCellWithReuseIdentifier: homeCell)
        view.addSubview(collectionView)


【问题讨论】:

【参考方案1】:

这是一个简单的修复。我关注了this answer。

override var prefersStatusBarHidden: Bool 
    return navigationController?.isNavigationBarHidden ?? false

并确保您的应用程序 .plist 文件中有“查看基于控制器的状态栏外观”=“YES”。

【讨论】:

以上是关于Swift iOS -NavigationBar hidesBarsOnSwipe 在状态栏下设置 CollectionView Frame 时永远不会重新出现的主要内容,如果未能解决你的问题,请参考以下文章

iOS开发中OC和swift的对比

ios OC、swift混编制作framework

iOS-swift-基础篇1

iOS开发系列--Swift 3.0

swift 2016年 - iOS / PlayerViewController.swift

swift iOS URL Schemes Swift