答案 0 :(得分:25)
我找到了解决方法。此问题是标题视图的zPosition
由集合视图错误地设置。要解决此问题,我们将始终确保zPosition
是我们想要的值。
创建一个CALayer
子类,以防止zPosition
为0以外的其他任何内容。
class CustomLayer: CALayer {
override var zPosition: CGFloat {
get { return 0 }
set {}
}
}
然后将集合视图标题的图层类设置为此新子类。
class MyHeaderView: UICollectionReusableView {
// your other custom code here
override class var layerClass: AnyClass {
get { return CustomLayer.self }
}
}
这是一个iOS 11错误,因为iOS 10中没有出现此问题。希望这个问题能够很好地解决,直到修复错误。
答案 1 :(得分:16)
相同的概念,但这里有一个更简单的解决方法,不需要您的UICollectionReusableView
实例使用子类。
符合UICollectionViewDelegate
(如果您还没有)并实施willDisplaySupplementaryView协议方法,如下所示:
func collectionView(_ collectionView: UICollectionView, willDisplaySupplementaryView view: UICollectionReusableView, forElementKind elementKind: String, at indexPath: IndexPath) {
view.layer.zPosition = 0.0
}
在iOS 11.2.1中测试。
答案 2 :(得分:1)
使用长滚动,异步加载集合,此替代方案可能会提供稍好的性能。
class MyHeaderView: UICollectionReusableView {
override func apply(_ layoutAttributes: UICollectionViewLayoutAttributes) {
layer.zPosition = 0
}
}
答案 3 :(得分:0)
这是我的替代方法,当继承UICollectionReusableView
时,它似乎在 iOS12 上更好地工作。
final class BasicCollectionSectionHeader: UICollectionReusableView {
override var layer: CALayer {
let layer = super.layer
layer.zPosition = 0 // make the header appear below the collection view scroll bar
return layer
}
}