29 votes

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!

entrez la description de l'image ici

27voto

nathangitter Points 6663

J'ai trouvé une solution de contournement. Cette question est que l' zPosition de l'en-tête de la vue est définie par l'affichage de la collection de manière incorrecte. Pour résoudre ce problème, nous ferons toujours en sorte que l' zPosition est notre valeur souhaitée.

Créer un CALayer sous-classe qui empêche l' zPosition d'être autre chose que 0.

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

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

class MyHeaderView: UICollectionReusableView {

    // your other custom code here

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

}

C'est un iOS 11 bug, que ce problème ne se produit pas dans iOS 10. J'espère que cela fonctionne assez bien jusqu'à ce que le bug est corrigé.

19voto

Keller Points 6797

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 la méthode du protocole willDisplaySupplementaryView 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.

2voto

josh-fuggle Points 746

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
    }
}
 

1voto

Nate Whittaker Points 833

Avec une collection à chargement 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
    }
}
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X