Быстрое горизонтальное UICollectionView с динамической высотой ячейки - PullRequest
0 голосов
/ 04 октября 2019

У меня есть горизонтальное представление коллекции с базовым размером frame.width и 330 height. Что я сделал:

1) Поместил представление коллекции и установил ограничения: ведущий - 0, конечный - 0, верхний - 0, высота - 330

2) Затем установите размер ячейки в frame.widthи высота 330

3) Но иногда в моей ячейке есть больше контента, поэтому я хочу расширить ячейку до 370

Я пытался создать выход для ограничения коллекции и изменить его в методе cellForItem, но, похоже,как это не правильный путь. Сборник помещается в ScrollView, если это имеет значение enter image description here

1 Ответ

0 голосов
/ 04 октября 2019

Создайте имя метода estimateFrameForText, и этот метод вернет значение высоты, которое будет соответствовать вашей строке!

private func estimateFrameForText(text: String) -> CGRect {
    //we make the height arbitrarily large so we don't undershoot height in calculation
    let height: CGFloat = 320

    let size = CGSize(width: yourDesiredWidth, height: height)
    let options = NSStringDrawingOptions.UsesFontLeading.union(.UsesLineFragmentOrigin)
    let attributes = [NSFontAttributeName: UIFont.systemFontOfSize(18, weight: UIFontWeightLight)]

    return NSString(string: text).boundingRectWithSize(size, options: options, attributes: attributes, context: nil)
}

Вы должны использовать UICollectionViewDelegateFlowLayout и реализовать sizeForItemAt, как показано ниже. [убедитесь, что ваш класс продлен UICollectionViewDelegateFlowLayout]

    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
        let sectionInset = (collectionViewLayout as! UICollectionViewFlowLayout).sectionInset

         var referenceWidth: CGFloat = collectionView.safeAreaLayoutGuide.layoutFrame.width

         var referenceHeight: CGFloat = 320

       //we are just measuring height so we add padding constant to give the label some room to breathe! 
       var padding: CGFloat = <someArbitraryPaddingValue>

       //estimate each cell's height
       if let text = array?[indexPath.item].text {
           referenceHeight= estimateFrameForText(text).height + padding
       }

        return CGSize(width: referenceWidth, height: referenceHeight)
    }
...