Как стать автором
Обновить

Комментарии 10

Спасибо, очень интересно. Выглядит и работает очень круто, жаль что вас небыло год назад :)
НЛО прилетело и опубликовало эту надпись здесь
Основные отличия:

  • расчет лейаута в фоновом потоке;
  • поддержка постраничной загрузки сообщения в обоих направлениях;
  • работающий интерактивный режим скрытия клавиатуры.
К сожалению, Эппловская документация грозится полной блокировкой работы с UIKit из фонового потока — со следующей мажорной версии iOS попытка обратиться к интерфейсу из фонового потока будет кидать исключение.

Так же, используя autolayout, вы можете кешировать размер ячеек без предварительного расчёта совсем: в методе cellWillDisplay: размеры ячеек уже рассчитаны и вы можете получить актуальный frame ячейки.
Но вот основной проблемой остаётся прокрутка в середину таблицы — эта операция требует полного пересчёта всех промежуточных ячеек, либо кучи магии с перепозиционированием.
Мы не используем UIKit в фоновом потоке. Для расчета размеров текста используется функция NSString.boundingRectWithSize(_:options:attributes:context)
Как вы решили неточность расчёта размера текста?
Если ничего не изменилось за 2 мажорные версии iOS — boundingRectWithSize и, собственно, UITextView используют разные движки рендера текста. И результирующие размеры не совпадают.

Собственно, типичная ситуация: на 100 строк текста шрифтом Helvetica Neue boundingRectWithSize: даёт ошибку больше, чем высота двух строк.
В статье описано как это сделано:

textView.textContainerInset = UIEdgeInsetsZero
textView.textContainer.lineFragmentPadding = 0
textContainerInset даёт константную ошибку, так что это точно не оно. lineFragmentPadding… Может быть.
Я обычно создаю CTFramesetter и использую CTFramesetterSuggestFrameSizeWithConstraints.
Спасибо за Chatto всем его авторам! Спасибо, что выложили в open source! Вещь очень классная. Я погонял ChattoApp под хорошей нагрузкой. Отлично справляется. Другие, известные мне, движки далеко позади.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий