it-swarm.com.ru

Авторазмер высоты UICollectionView, чтобы приспособиться к его размеру контента

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

Я знаю, как получить размер контента: 

collectionView.collectionViewLayout.collectionViewContentSize

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

UPD: Я опубликовал на GitHub демонстрационный проект, описывающий проблему: https://github.com/avokin/PostViewer

21
AVokin

Я не думаю, что вам нужен размер контента. Я думаю, что вы хотите отрегулировать количество экранного пространства, потребляемого представлением коллекции, верно? Это потребует корректировки рамы. Размер содержимого включает в себя область вне экрана (прокрутка), а также экранное представление.

Я не знаю ничего, что могло бы помешать вам просто изменить размер кадра на лету:

collectionView.frame = CGRectMake (x,y,w,h);
[collectionView reloadData];

Если я вас правильно понимаю.

6
RegularExpression

Используйте ограничение высоты для представления коллекции и при необходимости обновите его значение высотой содержимого. Смотрите этот ответ: https://stackoverflow.com/a/20829728/3414722

6
sammalfix

Шаги для изменения фрейма UICollectionView:

  1. Установите для свойства "translatesAutoresizingMaskIntoConstraints" значение YES для суперпредставления collectioview (если вы используете AUTOLAYOUT)

  2. Затем обновите кадр collectioview как:

    collectionView.frame = CGRectMake (x,y,w,h);
    [collectionView reloadData];
    
0
Shahul Hasan

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

Я использую SnapKit в следующем коде.

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

private func constrainViews() {
    collectionView?.translatesAutoresizingMaskIntoConstraints = true

    collectionView?.snp.makeConstraints { make in
        make.edges.equalToSuperview()
        heightConstraint = make.height.equalTo(0).constraint
    }
}

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

override func viewDidLayoutSubviews() {
    guard
        let collectionView = collectionView,
        let layout = collectionViewLayout as? UICollectionViewFlowLayout
    else {
        return
    }

    let sectionInset = layout.sectionInset
    let contentInset = collectionView.contentInset

    let indexPath = IndexPath(item: tags.count, section: 0)
    guard let attr = collectionViewLayout.layoutAttributesForItem(at: indexPath) else {
        return
    }

    // Note sectionInset.top is already included in the frame's Origin
    let totalHeight = attr.frame.Origin.y + attr.frame.size.height
        + contentInset.top + contentInset.bottom
        + sectionInset.bottom

    heightConstraint?.update(offset: totalHeight)
}

Обратите внимание, что в этом примере у меня всегда есть один специальный тег, не включенный в мои элементы tags count, поэтому строка:

let indexPath = IndexPath(item: tags.count, section: 0)

должно быть что-то вроде if items.count > 0 ... let indexPath = IndexPath(item: tags.count - 1, section: 0) в большинстве других кодов.

0
emp