滚动UICollectionView时如何自定义顶部屏幕粘贴的标题视图?

时间:2018-01-16 08:11:39

标签: ios swift uicollectionview

我的UICollectionReusableView中有标题(标题:UICollectionView)。标头有3个UIView(UIView1UIView2UIView3)。当我设置collectionLayout.sectionHeadersPinToVisibleBounds = true时,当我滚动集合时,标题将位于顶部。我希望当标题贴在UICollectionView之上时,我会隐藏UIView1UIView2。我怎样才能做到这一点?

1 个答案:

答案 0 :(得分:0)

UICollectionViewUIScrollView的子类。这意味着您要为其分配一个委托,然后该委托可以监听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)
        }
    }
}

我希望这能让你走上正轨。