2013-04-08 3 views
2

В настоящее время я работаю над клиентом iOS для веб-чата. Таким образом, сообщения чата имеют HTML-теги (жирный, курсив, подчеркнутый, цвет шрифта, изображения (улыбки) и т. Д.). Например:Лучший способ отображения текста с тегами HTML в приложении iOS?

<b>bold</b> <i>italic</i> <!--smile:bird--><img style="vertical-align: middle;border: none;" alt="bird" src="http://www.site.com/engine/data/emo_chat/bird.gif" /><!--/smile--> ordinaty text

На данный момент у меня есть 2 идеи, как отображать сообщения:

  1. Добавить UIWebView в таблицах ячейки. Но я думаю, что это не вариант, потому что у нас будет много сообщений и много WebView.
  2. Добавить UITextView в таблицу таблиц, проанализировать теги HTML и внести необходимые изменения в атрибутированную строку. Но UITextView не поддерживает изображения (если я прав).

Есть ли другой (лучший) способ отображения таких данных (стилизованный текст + изображения)?

+0

Это HTML, а не BBCode. – Jesper

+0

Спасибо, фиксированное название – dscTobi

+0

Вы также можете добиться этого с помощью родных классов iOS. См. Этот ответ http://stackoverflow.com/a/18886718/1760527 – user1760527

ответ

1

Вы можете получить представление об RTLabel материалах. Он делает то же, что и вы.

+0

Спасибо, очень приятно. Но похоже, что он не поддерживает образы (т. Е. Тег IMG) :( – dscTobi

3

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

Вам нужно проанализировать текст HTML, который вы указали, в атрибутированную строку, используя библиотеку, такую ​​как DTCoreText. Отсюда, если вы можете настроить iOS 6 или более позднюю версию, вы можете установить свойство attributedText по стандарту UILabel. Если вам нужно настроить таргетинг на более ранние версии iOS, вы можете снова использовать DTCoreText, в частности компоненты DTAttributedLabel или DTAttributedTextCell.

Разбор и NSAttributedString рендеринг можно сделать вручную, используя синтаксический анализатор XML и CoreText, но DTCoreText упростит вашу жизнь.

Обновление: Вы упомянули в комментарии, что хотите поддерживать <img/>. DTCoreText имеет некоторую базовую поддержку изображений, но это очень тяжелая проблема, если вы выполняете рендеринг текста с помощью CoreText, потому что вам нужно правильно сделать поток текста вокруг изображения и зарезервировать некоторое пространство в основном текстовом рендерере, чтобы поместить ваше изображение. Если для каждой ячейки есть только одно изображение, я бы предложил вам вручную извлечь путь/URL-адрес изображения и выложить его с помощью UIImageView рядом с текстом.

+0

Не простой способ, но я постараюсь. – dscTobi