Как изменить горизонтальную высоту UICollectionView на основе его содержимого в UITableViewCell - PullRequest
0 голосов
/ 24 октября 2018

Я пытаюсь поместить UICollectionView в UITableViewCell.Я хочу отображать комментарии в UICollectionViewCell с подкачкой страниц.В комментариях может быть более одной строки, поэтому я хочу изменить размер UICollectionView, если в ярлыке комментария более одной строки.

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

Ячейки будут выглядеть следующим образом.

enter image description here

Iпопробовал несколько ответов, но я не смог добиться никакого прогресса.Можете ли вы сказать мне, что мне нужно делать шаг за шагом?Демо было бы намного лучше, если бы вы могли поделиться.Спасибо.

Ответы [ 2 ]

0 голосов
/ 24 октября 2018

ОК. Итак, у меня возникла та же проблема ... Я исправил ее, выполнив следующие шаги ...

Создайте выходное значение ограничения высоты для представления коллекции, которое вы будете устанавливать на основе динамического содержимого.у тебя есть.

`@IBOutlet private(set) weak var collectionViewHeightConstraint: NSLayoutConstraint!`

Найдите самую большую модель контента (которая в вашем случае будет самым большим комментарием) и найдите высоту самой большой ячейки представления коллекции.Это можно сделать с помощью следующего метода.

private func getSizingCellHeight(for item: T.YourModel) -> CGFloat {
    guard let sizingCell = sizingCell else {
        return 0
    }

    sizingCell.frame.size.width = collectionViewItemWidth // This would be the width your collection view has
    sizingCell.prepareForReuse()

    // This is the method inside of your collection view cell, which lays out the content of the cell 
    sizingCell.configure(with: item)
    sizingCell.layoutIfNeeded()

    var fittingSize = UILayoutFittingCompressedSize
    fittingSize.width = collectionViewItemWidth

    let size = sizingCell.contentView.systemLayoutSizeFitting(
        fittingSize,
        withHorizontalFittingPriority: .required,
        verticalFittingPriority: .defaultLow
    )

    return size.height
}

Запуск вышеуказанного метода даст вам высоту наибольшей ячейки, которую вы можете использовать для ограничения высоты collectionView.

private func setCollectionViewHeight() {
    var largestHeight: CGFloat = 0

    //items would be your datasource for the collection view
    let items: [YourModel] = .... with some values
    if let items = items {
        for item in items {
            let height = getSizingCellHeight(for: item)
            if height > largestHeight {
                largestHeight = height
            }
        }
    }

    collectionViewHeightConstraint?.constant = largestHeight
}

Это настоящий рабочий код, который у меня есть в моем проекте.

Из того, что я помню в последний раз, я следовал статье Чарли .

Статья также имеет рабочую демонстрацию на Github

0 голосов
/ 24 октября 2018

Для динамического определения размера ячеек, основанного на длине вашего контента, вам в основном нужно сделать несколько приближений.Так вот мое решение.Для правильных расчетов требуется пара проб и ошибок.Пожалуйста, потерпите меня сейчас!

override func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {

    if let user = datasource?.item(indexPath) as? User {
        let approximateWidthBioTextView = view.frame.width - 10 - 60 - 10
        let size = CGSize(width: approximateWidthBioTextView, height: 1000)
        let attributes = [NSAttributedString.Key.font: UIFont.systemFont(ofSize: 15)]

        let estimatedFrame = NSString(string: user.bio).boundingRect(with: size, options: .usesLineFragmentOrigin, attributes: attributes, context: nil)

        return CGSize(width: view.frame.width, height: estimatedFrame.height + 73)
    }

    return CGSize(width: view.frame.width, height: 200)
}

По сути, вам нужно изменить функцию sizeForItem и сделать некоторые приближения.Мое содержание определяется экземплярами User Class.Поэтому убедитесь, что перед тем, как вы начнете получать ссылки на контент, который у вас есть в вашей камереВ моем случае это пользователи, которые должны отображаться.В нескольких словах мои решения получают высоту ячейки на основе user.bioText.Потому что это единственный элемент, который меняет размер в моей ячейке.Так что имейте это в виду.

Сначала вы должны вычислить collectionView с помощью.В моем случае это ширина кадра минус поля (10, 60 и 10).Помните, важно сделать это правильно.

Во-вторых, чтобы оценить высоту ячейки, нам нужно обернуть ее в прямоугольник, который имеет некоторые атрибуты, которые необходимо заполнить.В константе size мы сознательно даем высокое значение, чтобы система брала то, что ей действительно нужно.Теперь для атрибутов, если ваш контент является строкой, как в моем случае, убедитесь, что у вас тот же размер шрифта.

Наконец, в разделе возврата return CGSize(width: view.frame.width, height: estimatedFrame.height + 73) нам все еще нужно внести некоторые исправления, потому что текст имеет некоторые внутренние отступы, если я могу так сказать, и если вы не исправите это, высота вашей ячейки не будет отображаться правильно,Убедитесь, что вы играете с последним значением estimatedFrame.height + 73, в моем случае 73, пока не дойдете до точки, где ваши клетки высотой динамически распределяются идеально.Это единственный способ.Это точно работает для меня.

Кстати, не беспокойтесь, если ваш код выглядит немного по-другому (хотя и не слишком).Я использую рамки, но принципы расчета те же.Если вы спрашиваете себя, откуда берется значение 73, то это потому, что в верхней части текста биографии, который мне нужно отобразить в каждой ячейке, у меня есть метки имени пользователя и имени пользователя, которые имеют восемь из 20, что составляет 40в общей сложности 33 - это разрыв или поля между ними.Пока вы даете ему минимальное значение, оно должно работать.Это на самом деле не влияет на результат, если вы даете ему слишком высокое значение.Так что экспериментируйте!

...