UICollectionView .reloadData () показывает только разделы - PullRequest
0 голосов
/ 30 сентября 2018

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

Поскольку слова отличаются по размеру, я добавил следующее, чтобы предотвратить обрезку длинных слов: layout.estimatedItemSize = CGSize(width: 1.0, height: 1.0)

Однако после установки этого и вызова reloadData (), в ячейки (слова) загружаются не только разделы (заголовки).

Но после прокрутки все разделы, вышедшие из экрана, будут загружать свои слова.Однако, когда я не использую layout.estimatedItemSize, он работает правильно, но слова обрезаются.

Поэтому мой вопрос заключается в том, есть ли другой способ отобразить эти слова (которые в основном представляют собой небольшое представление с меткойбез их обрезания.Или я неправильно использую оценочный размер?

Как я читаю из документов самого яблока: документы Значением по умолчанию для этого свойства является CGSizeZero.Установка его в любое другое значение заставляет представление коллекции запрашивать каждую ячейку для ее фактического размера, используя метод предпочитаемый ячейкой selectedLayoutAttributesFitting (_ :).

Я устанавливаю ограничения динамически и статически (StoryBoard), мое динамическое ограничение какследующее:

if prevCell != nil {
    let constraint = NSLayoutConstraint(item: cell, attribute: NSLayoutAttribute.leading, relatedBy: NSLayoutRelation.equal, toItem: prevCell, attribute: NSLayoutAttribute.trailing, multiplier: 1.0, constant: 5.0)
    cell.addConstraint(constraint)
    self.prevCell = cell
}

Вещи, которые я пробовал до сих пор:

//before reload data invalidate the layout
    self.collectionView!.collectionViewLayout.invalidateLayout()
    self.collectionView!.reloadData()

1 Ответ

0 голосов
/ 30 сентября 2018

После еще одного исследования нашел правильный способ справиться с этим.Я забыл переопределить предпочитаемыйLayoutAttributesFitting в классе ячейки.Чтобы заставить его работать, я просто оставил layout.estimatedItemSize = CGSize(width: 1.0, height: 1.0) в viewDidLoad представления коллекции.

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

Но при переопределенииfitLightoutAttributesFitting, как указано ниже:

    override func preferredLayoutAttributesFitting(_ layoutAttributes: UICollectionViewLayoutAttributes) -> UICollectionViewLayoutAttributes {
        setNeedsLayout()
        layoutIfNeeded()
        let updatedSize = contentView.systemLayoutSizeFitting(layoutAttributes.size)
        var updatedFrame = layoutAttributes.frame
        updatedFrame.size.width = CGFloat(ceilf(Float(updatedSize.width)))
        updatedFrame.size.height = CGFloat(ceilf(Float(updatedSize.height)))
        layoutAttributes.frame = updatedFrame
        return layoutAttributes
    }
...