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!
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é.
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.
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
}
}
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
}
}