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