Как настроить высоту UICollectionView на высоту размера содержимого UICollectionView?

Я хотел бы, чтобы UICollectionView (красный) сжимался до высоты размера содержимого в этом случае UICollectionViewCells(желтые), потому что есть много пустого пространства. То, что я пытался использовать:

override func layoutSubviews() {
    super.layoutSubviews()
    if !__CGSizeEqualToSize(bounds.size, self.intrinsicContentSize) {
        self.invalidateIntrinsicContentSize()
    }
}

override var intrinsicContentSize: CGSize {
    return self.collection.contentSize
}

но return self.collection.contentSize всегда возвращать (ширина, 0) и по этой причине он слишком сильно сжимается до значения высоты 30 (значение, которое я установил в файле xib для высоты, хотя у меня есть constaint >= 30).

enter image description here

5 ответов


Я бы предложил следующее:

  1. добавьте ограничение высоты в представление коллекции.
  2. установите свой приоритет в 999.
  3. установите его константу в любое значение, которое только делает его разумно видимым на раскадровке.
  4. измените нижнее равное ограничение представления коллекции на большее или равное.
  5. подключите ограничение высоты к розетке.
  6. каждый раз, когда вы перезагрузите данные в представлении коллекции выполните следующие действия:

Код:

CGFloat height = myCollectionView.collectionViewLayout.collectionViewContentSize.height
heightConstraint.constant = height
self.view.setNeedsLayout() Or self.view.layoutIfNeeded()

объяснение: дополнительно, вам не нужно читать, если вы это понимаете. очевидно!!

пользовательский интерфейс попытается отразить все ограничения независимо от их приоритетов. Поскольку ограничение высоты имеет более низкий приоритет (999) и снизу ограничение типа "больше или равно". всякий раз, когда константа ограничения высоты установите значение меньше высоты родительского представления представление коллекции будет равно заданной высоте, достигая обоих ограничений.

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

следующее - Это просто догадка из опыта. Итак, он достигает одного constrant. Но, он также пытается сделать в результирующем пользовательском интерфейсе для другого недостижимого ограничения с более низким приоритетом как можно ниже. Таким образом, высота представления коллекции будет равна размеру родительского представления.


Я закончил, подклассом UICollectionView и переопределение некоторых методов следующим образом.

  • возвращение self.collectionViewLayout.collectionViewContentSize на intrinsicContentSize убеждается, всегда иметь правильный размер
  • тогда просто позвоните ему, когда он может измениться (например, на reloadData)

код:

override func reloadData() {
    super.reloadData()
    self.invalidateIntrinsicContentSize()
}

override var intrinsicContentSize: CGSize {
    return self.collectionViewLayout.collectionViewContentSize
}

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


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

HeightConstraint.constant = collection.contentSize.height 

выполните следующие действия.

  1. первый набор высоты ограничения для UICollectionView
  2. здесь calendarBaseViewHeight и UICollectionView переменной высоты
  3. вызвать функцию после перезагрузки представления коллекции

    func resizeCollectionViewSize(){  
           calendarBaseViewHeight.constant = collectionView.contentSize.height      
     }
    

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

    collectionView.frame = CGRectMake (x,y,w,collectionView.collectionViewLayout.collectionViewContentSize.height); //objective c
    //[collectionView reloadData];
   collectionView.frame = CGRect(x: 0, y: 0, width: width, height: collectionView.collectionViewLayout.collectionViewContentSize.height) // swift