web-dev-qa-db-ja.com

UICollectionViewセクションヘッダーの下にスクロールバーが誤って表示される

何らかの理由で、スクロールバーは常にコレクションビューセクションヘッダーの下に表示されます。どんな助けも大歓迎です!

enter image description here

29
Soja

回避策を見つけました。この問題は、ヘッダービューの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のバグです。バグが修正されるまで、これが十分に機能することを願っています。

27
nathangitter

同じ概念ですが、サブクラスを使用するために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でテスト済み。

19
Keller

これは、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
    }
}
2
josh-fuggle

長いスクロールの非同期読み込みコレクションを使用すると、この選択肢はパフォーマンスがわずかに向上する場合があります。

class MyHeaderView: UICollectionReusableView {
    override func apply(_ layoutAttributes: UICollectionViewLayoutAttributes) {
        layer.zPosition = 0
    }
}
1
Nate Whittaker