UICollectionViewCompositionalLayout: контролировать количество элементов в группе с дробной шириной группы
С помощью UICollectionViewCompositionalLayout
, Я бы хотел отобразить определенное количество элементов в одной группе и определенное количество элементов в другой группе
Это упрощенная версия схемы, которую я придумал:
func createTestSectionLayout(noTextItems: Int, noImageItems: Int) -> NSCollectionLayoutSection {
// noTextItems texts can have different lengths
let textItemSize = NSCollectionLayoutSize(widthDimension: .estimated(80),
heightDimension: .estimated(44))
var textItems = [NSCollectionLayoutItem]()
for _ in 0..<noTextItems {
textItems.append(NSCollectionLayoutItem(layoutSize: textItemSize))
}
let textGroupSize = NSCollectionLayoutSize(widthDimension: .fractionalWidth(0.6), heightDimension: .estimated(44))
let textGroup = NSCollectionLayoutGroup.horizontal(layoutSize: textGroupSize, subitems: textItems)
// noImageItems images should be rendered with their intrinsic size
let imageItemSize = NSCollectionLayoutSize(widthDimension: .estimated(80),
heightDimension: .estimated(44))
var imageItems = [NSCollectionLayoutItem]()
for _ in 0..<noImageItems {
imageItems.append(NSCollectionLayoutItem(layoutSize: imageItemSize))
}
let iamgeGroupSize = NSCollectionLayoutSize(widthDimension: .fractionalWidth(0.4), heightDimension: .estimated(44))
let imageGroup = NSCollectionLayoutGroup.horizontal(layoutSize: iamgeGroupSize, subitems: imageItems)
// group that contains textGroup and imageGroup
let lineGroupSize = NSCollectionLayoutSize(widthDimension: .fractionalWidth(1.0), heightDimension: .estimated(44))
let lineGroup = NSCollectionLayoutGroup.horizontal(layoutSize: lineGroupSize, subitems: [textGroup,imageGroup])
print(lineGroup.visualDescription())
print()
let section = NSCollectionLayoutSection(group: lineGroup)
return section
}
В качестве примера я вызвал метод с
let test = self.createTestSectionLayout(noTextItems: 2, noImageItems: 3)`
Результат print(lineGroup.visualDescription())
интересно и иллюстрирует мою проблему:
+ ------- + ------- + ------- + ------- + ------- + ------- + - ------ + --- + ------- + ------- + ------- + ------- + ------- + | | | | | | | | | | | | | | + ------- + ------- + ------- + ------- + ------- + ------- + - ------ + + ------- + ------- + ------- + ------- + ------- + | | | | | | | + ------------------------------------------------- -------------------------------------------------- +
Каждый маленький блок в этой графике ascii - это позиция, в которой элемент может (и будет) отображаться.
Таким образом, учитывая, что элементы для визуализации достаточно малы, все 5 элементов (2 текста, 3 изображения) отображаются в левой textGroup, даже если эта группа содержит только 2 экземпляра NSCollectionLayoutItem
.
Мои эксперименты показывают, что это непреднамеренное поведение контролируется .fractionalWidth(0.6)
размера группы. Как только я им воспользуюсь,UICollectionViewCompositionalLayout
игнорирует количество элементов, которые я указываю в этой группе.
UICollectionViewCompositionalLayout
учитывает количество элементов в группе, если я установил ширину группы примерно так .estimated(200)
. Но это испортит мой макет и сделает его непригодным для использования.
Как я могу контролировать количество элементов в группе и иметь ширину группы, указанную.fractionalWidth(0.6)
? Я ожидаю, что у меня будет разрыв строки элементов, если они не помещаются в ряд, поскольку я дал дробную ширину и приблизительную высоту группы.