我的项目中有一个要求,当它们变粘时,我必须向UICollectionView标头添加阴影。
我在UICollectionViewFlowLayout sectionHeadersPinToVisibleBounds上使用该属性,当设置为YES时,标题会变粘。
我的问题是 - 当标题变得粘滞并实际固定到顶部时,我们可以获得某种回调,以便我可以为该标题添加阴影。当标题不粘时,我不希望阴影存在。
这里的挑战是,我无法真正利用method- layoutAttributesForSupplementaryView中的信息:它确实为我提供了屏幕上的视图,因为我的部分具有动态的项目,因此哪个部分在屏幕上并不真正告诉我谁需要一个影子。
感谢任何帮助。谢谢。
答案 0 :(得分:1)
我设法通过以下方式找到了这个问题的解决方案:
手动保存标题的位置:
func collectionView(_ collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, at indexPath: IndexPath) -> UICollectionReusableView {
let cell = collectionView.dequeueReusableSupplementaryView(ofKind: UICollectionElementKindSectionHeader, withReuseIdentifier: "CategoryNameReusableView", for: indexPath) as! CategoryNameReusableView
cell.nameLbl.text = sectionNames[indexPath.section]
if viewWithPosition.isEmpty { viewWithPosition.append(( name: cell.nameLbl.text!, position: cell.frame.origin.y))}
let x = isElementInArray(array: viewWithPosition, string: cell.nameLbl.text!)
if !x {
viewWithPosition.append((name: cell.nameLbl.text!, position: cell.frame.origin.y))
}
return cell
}
我正在使用viewWithPosition元组var viewWithPosition = [(name: String, position: CGFloat)]()
的数组。如果我只保存一个单元格的位置,它可能是相同的,但由于我的单元格有不同的文本,我使用name
参数来检查该元素是否已存在于数组中。我使用了辅助函数:
fileprivate func isElementInArray(array: [ViewAndPosition], string: String) -> Bool {
var bool = false
for views in array {
if views.name == string {
bool = true
return bool
}
}
return bool
}
当我有初始位置时,我会检查可见的标题是否放错位置:
func scrollViewDidScroll(_ scrollView: UIScrollView) {
if let visibleHeadersInSection = collectionView.visibleSupplementaryViews(ofKind: UICollectionElementKindSectionHeader) as? [CategoryNameReusableView] {
for header in visibleHeadersInSection{
if let index = viewWithPosition.index(where: { (element) -> Bool in
element.name == header.nameLbl.text
}){
if header.frame.origin.y == viewWithPosition[index].position {
header.backgroundColor = UIColor.clear
} else {
header.backgroundColor = UIColor.white
}
}
}
}
}
目前似乎Apple没有针对这种情况提供回调。希望这也是您的解决方案。