Равная высота UICollectionViewCell и UICollectionView

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

Я добавлю 300 в награду за ответ, который решает это!

func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize {

       return CGSize(width: 100, height: collectionView.frame.size.height)
    }

2015-12-16 18: 43: 53.643 My-app [1055: 434762] поведение ввода код здесьUICollectionViewFlowLayout не определен, потому что: 2015-12-16 18: 43: 53.643 My-app [1055: 434762] высота элемента должна быть меньше, чем высота UICollectionView минус секционные вставки сверху и снизу значения, минус верхние и нижние значения вставки содержимого. 2015-12-16 18: 43: 53.643 My-app [1055: 434762] Пожалуйста, проверьте значения, возвращаемые делегировать. 2015-12-16 18: 43: 53.644 My-app [1055: 434762] Соответствующие Экземпляр UICollectionViewFlowLayout, и он привязан к; layer =; contentOffset: {0, 0}; contentSize: {3087, 307} > макет коллекции:. 2015-12-16 18: 43: 53.644 My-app [1055: 434762] Сделать символическую точку останова в UICollectionViewFlowLayoutBreakForInvalidSizes, чтобы поймать это в отладчик.

Решение, которое работает на основе предложения hannads. Если есть лучшие способы, пожалуйста, дайте мне знать

Создал свойство с наблюдателем свойств.

var myCollectionViewHeight: CGFloat = 0.0 {
    didSet {
        if myCollectionViewHeight != oldValue {
            myCollectionView.collectionViewLayout.invalidateLayout()
            myCollectionView.collectionViewLayout.prepareLayout()
        }
    }
}

Переопределить этот метод (он называется несколько раз)

override func viewDidLayoutSubviews() {
    myCollectionViewHeight = myCollectionView.bounds.size.height
}

Тогда у меня это в моем делегате:

func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize {            
            return CGSize(width: 100, height: myCollectionViewHeight)
    }

Ответ 1

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

collectionView.collectionViewLayout.invalidateLayout()

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

Примечание: в настоящее время на моем мобильном телефоне и не проверяйте этот код. Возможно, я что-то пропустил.

Ответ 2

Попробуйте установить этот код на viewDidLoad:

self.automaticallyAdjustsScrollViewInsets = false

Надеюсь на эту помощь!

Ответ 3

Я столкнулся с этой проблемой, и я смог ее решить, вычитав соответствующий sectionInsets. Когда вы вычитаете вставки, которые не учитываются в свойстве .size.height, он принимает высоту.

Внутри sizeForItemAtIndexPath вам нужно вычесть размеры вставки раздела...

  let sectionInset = self.collectionView?.collectionViewLayout.sectionInset
  let heightToSubtract = sectionInset!.top + sectionInset!.bottom

  return CGSize(width: 100.0, height: (self.collectionView?.bounds.height)! - heightToSubtract)

ПРИМЕЧАНИЕ. Я могу отключить опции здесь, но чтобы быть в безопасности, вы можете проверить их.

Ответ 4

У меня была эта проблема, потому что я привязал мой UICollectionView к нижней части UITableViewCell, не указав высоту collectionView.

После создания нескольких сетевых запросов и последующего вызова [self.tableView reloadData] в UIViewController, я получил то же сообщение об ошибке в журнале.

Мне удалось разрешить его, разбив нижнее ограничение и указав UICollectionView фиксированную высоту.

Ответ 5

В моем случае я добавляю view collection в tableviewcell view, и высота элемента collectionview равна высоте tableviewcell. при изменении tableviewcellheiht я получаю это предупреждение. чтобы решить эту проблему, попробуйте этот код

  if (@available(iOS 11.0, *)) {
        _collectionView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
    } else {
    }

Ответ 6

Я боролся с этой проблемой более недели и, наконец, нашел ответ, который работал для моего конкретного случая. Моя проблема была связана с 1) загрузкой удаленных изображений в образе UICollectionViewCell и 2) оценочным размером ячейки, который был больше, чем тот, который я установил вручную для sizeForItemAt макета представления коллекции.

enter image description here

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
    return CGSize(width: collectionView.bounds.width, height: collectionView.bounds.height)
}

Я смог решить, уменьшив размер ячейки на раскадровке до размера, меньшего, чем размер моей ячейки, и я также установил для "Estimate Size" значение "None" (этой последней части, вероятно, достаточно)