UICollectionViewCompositionalLayout по горизонтали, без вычисления ширины контента при использовании оценки и без горизонтального объятия - PullRequest
0 голосов
/ 15 апреля 2020
I want the cell to horizontaly Hug its content

Я использую UICollectionViewCompositionalLayout в горизонтальном режиме и с widthDimension: .estimated(100), который должен вычислять размер контента

, но ширина ячейки / группы НЕ рассчитывается по размеру контента при all и устанавливается на приблизительные значения, поскольку это будет абсолютное значение

Даже добавление ограничения ширины к метке не влияет на размер ячейки

Является ли это ожидаемое поведение? Когда да, то почему? и как получить желаемый результат?

enter image description here

enter image description here

class LabelCell: UICollectionViewCell {
    @IBOutlet weak var label: UILabel!
}

class ViewController: UIViewController, UICollectionViewDataSource {

    func buildLayout() -> UICollectionViewCompositionalLayout {

        let itemSize = NSCollectionLayoutSize(widthDimension: .estimated(100), heightDimension: .absolute(32))
        let item = NSCollectionLayoutItem(layoutSize: itemSize)

        let groupSize = NSCollectionLayoutSize(widthDimension: .estimated(100), heightDimension: .absolute(32))
        let group = NSCollectionLayoutGroup.horizontal(layoutSize: groupSize, subitem: item, count: 1)

        let section = NSCollectionLayoutSection(group: group)
        section.interGroupSpacing = 10

        let configuration = UICollectionViewCompositionalLayoutConfiguration()
        configuration.scrollDirection = .horizontal
        return UICollectionViewCompositionalLayout(section: section, configuration: configuration)

    }

    @IBOutlet weak var collectionView: UICollectionView!

    let items = ["1", "12", "12345", "123456789"]

    override func viewDidLoad() {
        super.viewDidLoad()
        collectionView.collectionViewLayout = buildLayout()
    }

    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return items.count
    }

    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let c = collectionView.dequeueReusableCell(withReuseIdentifier: "LabelCell", for: indexPath) as! LabelCell
        c.label.text = items[indexPath.row]
        return c
    }
}

1 Ответ

1 голос
/ 29 апреля 2020

Чтобы правильно определить размер ваших клеток, измените:

let group = NSCollectionLayoutGroup.horizontal(layoutSize: groupSize, subitem: item, count: 1)

На это:

let group = NSCollectionLayoutGroup.horizontal(layoutSize: groupSize, subitems: [item])

Я не уверен, почему это изменение необходимо, так как эти строки говорят одно и то же. Тем не менее, это будет работать при условии, что в вашей ячейке представления коллекции указан фактический размер ячейки путем переопределения sizeThatFits(_:), preferredLayoutAttributesFitting(_:), с использованием Auto Layout и т. Д. c.

Для чего стоит документация для подпись первой функции говорит:

Указывает группу, которая будет иметь N элементов одинакового размера вдоль горизонтальной оси.

Комментарий для второй функции подпись не предъявляет таких претензий к предметам одинакового размера. В нем говорится:

Указывает группу, которая будет повторять элементы, пока доступное горизонтальное пространство не будет исчерпано.

...