Voici comment vous pouvez gérer UICollectionViewReusableView personnalisé avec mise en page automatique sans le fichier XIB.
- Implémentez la méthode de délégation
referenceSizeForHeaderInSection
.
- Dans celui-ci, instanciez la vue que vous utilisez comme vue d'en-tête.
- Définissez sa visibilité sur caché, pour éviter les clignotements.
- Ajoutez la vue à la vue d'ensemble de la vue de collection.
- Définissez sa mise en forme à l'aide de la mise en page automatique, pour correspondre au résultat visuel attendu de l'en-tête.
- Invoke
setNeedsLayout
et layoutIfNeeded
- Retirez la vue du superview
ATTENTION: Je ne suis pas un grand fan de cette solution, car il ajoute la vue personnalisée à la superview du CollectionView chaque fois, pour effectuer des calculs . Je n'ai pas remarqué de problèmes de performances. ATTENTION # 2: Je traiterais cela comme une solution temporaire et migrerais vers des vues supplémentaires de dimensionnement une fois publiées. J'utilise PureLayout pour l'autolayout.
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, referenceSizeForHeaderInSection section: Int) -> CGSize {
let header = CustomHeaderView()
header.isHidden = true;
self.view.addSubview(header)
header.autoPinEdge(toSuperviewEdge: .leading)
header.autoPinEdge(toSuperviewEdge: .trailing)
header.autoPin(toTopLayoutGuideOf: self, withInset: 0)
header.setupHeader(withData: self.data)
header.setNeedsLayout()
header.layoutIfNeeded()
header.removeFromSuperview()
return header.frame.size
}
http://stackoverflow.com/a/33696385/6064629 peut-être qu'il vous aidera. – Himanshu
Merci @himanshu. J'espère toujours qu'il y a une meilleure réponse que celle parce que cette solution instancie fondamentalement une copie supplémentaire de 'UICollectionReusableView' et l'écarte juste après. –
@KelvinLau avez-vous réussi à comprendre quoi que ce soit? Je ne suis pas un grand fan de la solution fournie, car elle nécessite un fichier XIB. – Michael