UICollectionView Dynami c высота ячейки при сбое NSAttributedString - PullRequest
0 голосов
/ 07 мая 2020

У меня есть UICollectionView, который вертикально отображает простые ячейки с UITextView в них. Ячейки динамически изменяют свою высоту в зависимости от длины текста внутри их UITextView, например:

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {

    let textView = UITextView(frame: CGRect(x: 0, y: 0, width: collectionView.bounds.width, height: 0))
    textView.isScrollEnabled = false
    textView.text = text
    textView.sizeToFit()
    return CGSize(width: collectionView.bounds.width, height: textView.frame.size.height)
}

Это работает замечательно во всех случаях String и NSAttributedString, кроме одного. Если я хочу отобразить HTML в UITextView, а затем изменить размер отредактированной ячейки, используя collectionView.reloadItems(at: [editedCellIndex]), приложение выйдет из строя с этой ошибкой:

"[CollectionView] Обнаружена попытка обновить информацию о макете находясь в процессе вычисления макета (т. е. повторного вызова). Это приведет к неожиданному поведению или ошибке sh. Это может произойти, если при вызове делегата запускается проход макета. "

Код для загрузки HTML для получения высоты ячейки выглядит следующим образом:

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {

    let textView = UITextView(frame: CGRect(x: 0, y: 0, width: collectionView.bounds.width, height: 0))
    textView.isScrollEnabled = false

    if let data = text.data(using: .utf8), let attrText = try? NSAttributedString(data: data, options: [.documentType: NSAttributedString.DocumentType.html, .characterEncoding: String.Encoding.utf8.rawValue], documentAttributes: nil) {
        textView.attributedText = attrText
    }
    else {
        textView.attributedText = NSAttributedString(string: text)
    }
    textView.sizeToFit()
    return CGSize(width: collectionView.bounds.width, height: textView.frame.size.height)
}

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

...