我的UICollectionReusableView
中有标题(标题:UICollectionView
)。标头有3个UIView(UIView1
,UIView2
,UIView3
)。当我设置collectionLayout.sectionHeadersPinToVisibleBounds = true
时,当我滚动集合时,标题将位于顶部。我希望当标题贴在UICollectionView
之上时,我会隐藏UIView1
和UIView2
。我怎样才能做到这一点?
答案 0 :(得分:0)
UICollectionView
是UIScrollView
的子类。这意味着您要为其分配一个委托,然后该委托可以监听scrollViewDidScroll(_ scrollView: UIScrollView)
方法,每次偏移在您的集合视图中更改时都会调用该方法。
在此活动中,您需要通过在集合视图上调用visibleSupplementaryViews
并检查其类类型来获取我认为您可能获得的所有标题视图。
如果收到的视图确实是您的标题,则需要检查其框架与集合视图的比较,并查看其位置是否在顶部。为此,您可以将帧转换为坐标:
func isHeader(headerView: UIView, onTopOfCollectionView collectionView: UICollectionView) -> Bool {
guard let collectionSuperView = collectionView.superview else {
return false // Collection view is not in view hierarchy. This will most likely never happen
}
let convertedFrame = headerView.convert(headerView.bounds, to: collectionSuperView) // Convert frame of the view to whatever is the superview of collection view
return convertedFrame.origin.y <= collectionView.frame.origin.y // Compare frame origins
}
所以我猜整个事情就像是:
func scrollViewDidScroll(_ scrollView: UIScrollView) {
collectionView.visibleSupplementaryViews(<#My identifier here#>).forEach { view in
if let header = view as? MyHeaderView {
header.hideSecondaryViews = isHeader(headerView: header, onTopOfCollectionView: collectionView)
}
}
}
我希望这能让你走上正轨。