回避策を見つけました。この問題は、ヘッダービューのzPosition
がコレクションビューによって誤って設定されていることです。これを修正するために、zPosition
が目的の値であることを常に確認します。
CALayer
が0以外になるのを防ぐzPosition
サブクラスを作成します。
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 10では発生しないため、これはiOS 11のバグです。バグが修正されるまで、これが十分に機能することを願っています。
同じ概念ですが、サブクラスを使用するために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でテスト済み。
これは、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
}
}
長いスクロールの非同期読み込みコレクションを使用すると、この選択肢はパフォーマンスがわずかに向上する場合があります。
class MyHeaderView: UICollectionReusableView {
override func apply(_ layoutAttributes: UICollectionViewLayoutAttributes) {
layer.zPosition = 0
}
}