【问题标题】:Nested UICollectionView does not hide NavigationBar on swipe嵌套的 CollectionView 不会在滑动时隐藏导航栏
【发布时间】:2017-02-01 20:44:32
【问题描述】:

我有一个 UICollectionViewController(嵌入在 NavigationViewController 中),它通过分页某些部分来水平滚动 UICollectionView:

if let flowLayout = collectionView?.collectionViewLayout as? UICollectionViewFlowLayout {
        flowLayout.scrollDirection = .horizontal
        flowLayout.minimumLineSpacing = 0
}

collectionView?.backgroundColor = .white
collectionView?.register(FeedCell.self, forCellWithReuseIdentifier: cellId)
//collectionView?.contentInset = UIEdgeInsetsMake(MenuBar.height, 0, 0, 0)
//collectionView?.scrollIndicatorInsets = UIEdgeInsetsMake(MenuBar.height, 0, 0, 0)
collectionView?.isPagingEnabled = true

每个部分或页面都包含另一个 UICollectionView(在 FeedCell 内),它垂直滚动通过一些 UICollectionViewCells。

在 UICollectionViewController 内部,我设置了

navigationController?.hidesBarsOnSwipe = true

只要只有一个 UICollectionView 就可以工作。但是由于 (Top)CollectionView 是水平滚动的,并且包含额外的 (Sub)CollectionView,它们是垂直滚动的,所以这个功能似乎不再起作用了。

我希望在 (Sub)CollectionView 垂直滚动时隐藏 NavigationBar。有没有什么技巧可以实现这一点?

【问题讨论】:

  • 你找到解决办法了吗?
  • 你是偶然解决的吗?
  • 不,我放弃了这个...

标签: ios swift uicollectionview uinavigationbar


【解决方案1】:
func scrollViewDidScroll(_ scrollView: UIScrollView) {
    if let navigationBar = self.navigationController?.navigationBar {
        let clampedYOffset = contentOffset.y <= 0 ? 0 : -contentOffset.y
        navigationBar.transform = CGAffineTransform(translationX: 0, y: clampedYOffset)
        self.additionalSafeAreaInsets.top = clampedYOffset
    }
}

这是我想出的解决方案。基本上修改 NavigationBar 的变换以在必要时将其移开。我还修改了 AdditionalSafeAreaInset,因为这会自动将您的所有内容向上移动以填充导航栏留下的空间。

此函数将作为 UICollectionViewDelegate 协议的一部分调用。

这适合我的目的 - 但如果您希望导航栏在用户快速向上滚动时出现(如在 safari 中),则必须添加一些额外的逻辑。

希望这会有所帮助!

【讨论】:

    【解决方案2】:

    你可以试试这样的代码(Swift 3.0):

    extension ViewController: UICollectionViewDelegate {
      func scrollViewDidScroll(_ scrollView: UIScrollView) {
        let isScrollingUp = scrollView.contentOffset.y - lastY > 0
        lastY = scrollView.contentOffset.y
        self.navigationController?.setNavigationBarHidden(isScrollingUp, animated: true)
      }
    
      func scrollViewDidEndDragging(_ scrollView: UIScrollView, willDecelerate decelerate: Bool) {
        if !decelerate {
          // show navigation bar ?
        }
      }
    
      func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
        // show navigationBar ?
      }
    }
    

    【讨论】:

    • 这非常接近我想要实现的目标......不幸的是,隐藏/显示动画的速度与滚动速度不同步,即因为“setNavigationBarHidden”速度似乎修复一下,即使在 CollectionView 滚动了一点点之后,导航栏也会被隐藏,这感觉有点奇怪。不过,感谢您的意见!
    • El_Chippo 您是否得到了确切的解决方案,您正在寻找什么?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-30
    • 2014-09-02
    • 1970-01-01
    • 2017-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多