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)? Я ожидаю, что у меня будет разрыв строки элементов, если они не помещаются в ряд, поскольку я дал дробную ширину и приблизительную высоту группы.

0 ответов

Другие вопросы по тегам