web-dev-qa-db-fra.com

La barre de défilement apparaît de manière incorrecte sous l'en-tête de section UICollectionView

Pour une raison quelconque, ma barre de défilement apparaît toujours sous l'en-tête de la section d'affichage de la collection. Toute aide est grandement appréciée!

enter image description here

29
Soja

J'ai trouvé une solution de contournement. Ce problème est que le zPosition de la vue d'en-tête est mal défini par la vue de collection. Pour résoudre ce problème, nous nous assurerons toujours que zPosition est la valeur souhaitée.

Créez une sous-classe CALayer qui empêche que le zPosition soit différent de 0.

class CustomLayer: CALayer {
    override var zPosition: CGFloat {
        get { return 0 }
        set {}
    }
}

Définissez ensuite la classe de couches de l'en-tête de votre vue de collection sur cette nouvelle sous-classe.

class MyHeaderView: UICollectionReusableView {

    // your other custom code here

    override class var layerClass: AnyClass {
        get { return CustomLayer.self }
    }

}

Il s'agit d'un bogue iOS 11, car ce problème ne se produit pas dans iOS 10. Espérons que cela fonctionne suffisamment bien jusqu'à ce que le bogue soit corrigé.

27
nathangitter

Même concept, mais voici une solution de contournement plus simple qui ne nécessite pas que vos instances UICollectionReusableView utilisent une sous-classe.

Se conformer à UICollectionViewDelegate (si vous ne l'avez pas déjà fait) et implémenter willDisplaySupplementaryView méthode de protocole comme ceci:

func collectionView(_ collectionView: UICollectionView, willDisplaySupplementaryView view: UICollectionReusableView, forElementKind elementKind: String, at indexPath: IndexPath) { view.layer.zPosition = 0.0 }

Testé dans iOS 11.2.1.

19
Keller

Voici mon alternative qui semble mieux fonctionner sur iOS12 lors du sous-classement UICollectionReusableView.

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

Avec une collection à défilement long et à chargement asynchrone, cette alternative peut offrir des performances légèrement meilleures.

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