У меня есть 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, но у меня также не будет хорошей анимации.