Il existe quelques façons dont vous pourriez faire face à ce problème.
Une façon est que vous pouvez donner à l'affichage de la collection la disposition de flux une estimation de la taille et de calcul de la taille de la cellule.
Remarque: Comme indiqué dans les commentaires ci-dessous, comme d'iOS 10, vous n'avez plus à fournir et l'estimation de la taille de déclencher l'appel à une des cellules func preferredLayoutAttributesFitting(_ layoutAttributes:)
. Précédemment (iOS 9) serait vous demander de fournir une estimation de la taille si vous voulais requête d'une des cellules prefferedLayoutAttributes.
(en supposant que vous utilisez des story-boards et l'affichage de la collection est connecté par l'intermédiaire de l'IB)
override func viewDidLoad() {
super.viewDidLoad()
let layout = collectionView.collectionViewLayout as? UICollectionViewFlowLayout
layout?.estimatedItemSize = CGSize(width: 375, height: 200) // your average cell size
}
Pour de simples cellules qui sera généralement suffisant. Si la taille est toujours incorrect, dans la vue de collection cellule, vous pouvez remplacer func preferredLayoutAttributesFitting(_ layoutAttributes: UICollectionViewLayoutAttributes) -> UICollectionViewLayoutAttributes
, qui vous donnera plus de finesse de grain de contrôle sur la taille de la cellule. Remarque: Vous aurez besoin de donner à la disposition de flux une estimation de la taille.
Ensuite remplacer l' func preferredLayoutAttributesFitting(_ layoutAttributes: UICollectionViewLayoutAttributes) -> UICollectionViewLayoutAttributes
de retour de la taille correcte.
override func preferredLayoutAttributesFitting(_ layoutAttributes: UICollectionViewLayoutAttributes) -> UICollectionViewLayoutAttributes {
let autoLayoutAttributes = super.preferredLayoutAttributesFitting(layoutAttributes)
let targetSize = CGSize(width: layoutAttributes.frame.width, height: 0)
let autoLayoutSize = contentView.systemLayoutSizeFitting(targetSize, withHorizontalFittingPriority: UILayoutPriorityRequired, verticalFittingPriority: UILayoutPriorityDefaultLow)
let autoLayoutFrame = CGRect(origin: autoLayoutAttributes.frame.origin, size: autoLayoutSize)
autoLayoutAttributes.frame = autoLayoutFrame
return autoLayoutAttributes
}
Sinon, au lieu de cela, vous pouvez utiliser une taille de cellule pour calculer la taille de la cellule dans l' UICollectionViewDelegateFlowLayout
.
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
let width = collectionView.frame.width
let size = CGSize(width: width, height: 0)
// assuming your collection view cell is a nib
// you may also instantiate a instance of our cell from a storyboard
let sizingCell = UINib(nibName: "yourNibName", bundle: nil).instantiate(withOwner: nil, options: nil).first as! YourCollectionViewCell
sizingCell.autoresizingMask = [.flexibleWidth, .flexibleHeight]
sizingCell.frame.size = size
sizingCell.configure(with: object[indexPath.row]) // what ever method configures your cell
return sizingCell.contentView.systemLayoutSizeFitting(size, withHorizontalFittingPriority: UILayoutPriorityRequired, verticalFittingPriority: UILayoutPriorityDefaultLow)
}
Alors que ce ne sont pas parfait, prêt pour la production exemples, ils devraient vous aider à démarrer dans la bonne direction. Je ne peux pas dire que c'est la meilleure pratique, mais cela fonctionne pour moi, même avec assez complexe de cellules contenant plusieurs labels, qui peut ou peut ne pas s'étendre sur plusieurs lignes.