Среда:UICollectionView
выглядит как UITableView
Пользовательский подкласс UICollectionViewFlowLayout для определения frame
из DecorationView
Включено автоматическое определение размера ячеек
Ожидаемое поведение:DecorationView
, который следует разместить в качестве фона для каждого раздела UICollectionView
Наблюдаемое поведениеDecorationView
сворачивается до произвольного размера:
Кажется, что UICollectionView
пытается вычислить автоматический размер для DecorationView
. Если я отключу ячейки Self-Sizing, декоративный вид будет размещен точно в ожидаемом месте.
Есть ли способ отключить автоматическое определение размера для DecorationView
?
В моем подклассе UICollectionViewFlowLayout
я просто беру первую и последнюю ячейки в разделе и растягиваю фон, чтобы заполнить пространство под ними. Проблема в том, что UICollectionView
не учитывает рассчитанный там размер:
override func layoutAttributesForDecorationView(ofKind elementKind: String, at indexPath: IndexPath) -> UICollectionViewLayoutAttributes? {
guard let collectionView = collectionView else {
return nil
}
let section = indexPath.section
let attrs = UICollectionViewLayoutAttributes(forDecorationViewOfKind: backgroundViewClass.reuseIdentifier(),
with: indexPath)
let numberOfItems = collectionView.numberOfItems(inSection: section)
let lastIndex = numberOfItems - 1
guard let firstItemAttributes = layoutAttributesForItem(at: IndexPath(indexes: [section, 0])),
let lastItemAttributes = layoutAttributesForItem(at: IndexPath(indexes: [section, lastIndex])) else {
return nil
}
let startFrame = firstItemAttributes.frame
let endFrame = lastItemAttributes.frame
let origin = startFrame.origin
let size = CGSize(width: startFrame.width,
height: -startFrame.minY + endFrame.maxY)
let frame = CGRect(origin: origin, size: size)
attrs.frame = frame
attrs.zIndex = -1
return attrs
}