[英]How to custom header view that sticky in top screen when scroll UICollectionView?
我有頭(頭: UICollectionReusableView
)在我UICollectionView
。 標頭具有3個UIView( UIView1
, UIView2
, UIView3
)。 當我設置collectionLayout.sectionHeadersPinToVisibleBounds = true
,在滾動集合時標題將位於頂部。 而且我想當標題UICollectionView
在UICollectionView
頂部時,我將隱藏UIView1
和UIView2
。 我怎樣才能做到這一點?
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)
}
}
}
我希望這能使您走上正確的道路。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.