У меня есть один UICollectionView с 3 различными разделами. Каждый раздел использует свой класс UICollectionViewCell для своих ячеек. Размер каждой ячейки не является фиксированным и зависит от размера ее содержимого. Я не могу понять, как динамически изменить размер нескольких различных классов ячеек в нескольких разделах представления коллекции.
Swift 4
Я пытался использовать этот блок кода на контроллере представления, который содержит UICollectionView (registerNib
метод - это пользовательский метод, который я построил):
override func viewDidLoad() {
super.viewDidLoad()
collectionView.dataSource = self
collectionView.delegate = self
collectionView.registerNib(name: FirstSectionCollectionViewCell.reuseIdentifier)
collectionView.registerNib(name: SecondSectionCollectionViewCell.reuseIdentifier)
collectionView.registerNib(name: ThirdSectionCollectionViewCell.reuseIdentifier)
if let collectionViewLayout = collectionView?.collectionViewLayout as? UICollectionViewFlowLayout {
collectionViewLayout.itemSize = UICollectionViewFLowLayout.automaticSize
collectionViewLayout.estimatedItemSize = CGSize(width: collectionView.bounds.width, height: 150)
}
}
, а затем это внутри КАЖДОГО из классов UICollectionViewCell:
override func awakeFromNib() {
super.awakeFromNib()
// stuff
}
override func preferredLayoutAttributesFitting(_ layoutAttributes: UICollectionViewLayoutAttributes) -> UICollectionViewLayoutAttributes {
setNeedsLayout()
layoutIfNeeded()
let size = contentView.systemLayoutSizeFitting(layoutAttributes.size)
var frame = layoutAttributes.frame
frame.size.height = ceil(size.height)
layoutAttributes.frame = frame
return layoutAttributes
}
Вышеописанное прекрасно работает, когда у вас есть толькоодин раздел представления коллекции с одним классом ячеек, высота которого является динамической, но это не работает для нескольких секций и классов ячеек.
Я предполагаю, что мне нужно сделать что-то особенное внутри метода UICollectionView sizeForItemAt
иизменить размер ячеек там, но я не уверен, как это сделать для динамического изменения размера. Я думаю, это будет выглядеть примерно так:
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
let width: CGFloat = collectionView.bounds.width
var height: CGFloat = 0
switch indexPath.section {
case 0:
height = // Need dynamic resizing here
case 1:
height = // Need dynamic resizing here
case 2:
height = // Need dynamic resizing here
}
return CGSize(width: width, height: height)
}