嵌套的UICollectionView不会在滑动

时间:2016-09-23 21:53:26

标签: ios swift uicollectionview uinavigationbar

我有一个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。有没有做到这一点的黑客?

2 个答案:

答案 0 :(得分:0)

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的转换,以在必要时将其移开。我还修改了额外的SafeAreaInset,因为这将自动将所有内容上移以填充导航栏剩余的空间。

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

这很适合我的用途-但是,如果您希望在用户快速向上滚动时(例如在野生动物园中)出现导航栏,则必须添加一些其他逻辑。

希望这会有所帮助!

答案 1 :(得分:-1)

您可以尝试这样的代码(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 ?
  }
}