"Отображение HTML в UILabel или UITextView на Swift"

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Swift-решение для базового HTML

За отображение HTML в Swift отвечает NSAttributedString:

swift
Скопировать код
// Этот подход лучше, чем использование обычной HTML-строки
let htmlString = "<b>Жирный текст выделяется!</b>"
let data = Data(htmlString.utf8)
if let attributedString = try? NSAttributedString(data: data, options: [.documentType: NSAttributedString.DocumentType.html], documentAttributes: nil) {
    yourTextView.attributedText = attributedString
}

Это пример передачи HTML-строки в NSAttributedString и установки его как attributedText для UILabel или UITextView.

Кинга Идем в IT: пошаговый план для смены профессии

Многострочное содержимое в UILabel

Необходимо многострочное содержимое в UILabel? Просто задайте числовое значение 0 для свойства label.numberOfLines и позвольте UILabel самому осуществлять расчет размера контента:

swift
Скопировать код
let label = UILabel()
label.numberOfLines = 0 // Позволим тексту быть многострочным
label.attributedText = attributedString // Применим полученный ранее текст

Повторное использование с помощью методов расширения

Чтобы избежать дублирования кода, создайте расширение для класса String:

swift
Скопировать код
extension String {
    func convertToAttributedString() -> NSAttributedString? {
        guard let data = self.data(using: .utf8) else { return nil }
        do {
            return try NSAttributedString(data: data,
                                          options: [.documentType: NSAttributedString.DocumentType.html],
                                          documentAttributes: nil)
        } catch {
            print("Ошибка при конвертации строки: достигнут предел... Эх!") // Маленькая шутка для фанатов Dragon Ball!
            return nil
        }
    }
}

// Воспользуйтесь расширением для текста в стиле Super Saiyan:
label.attributedText = htmlString.convertToAttributedString()

Визуализация

Есть такая простая истина: "Чем проще, тем лучше":

Markdown
Скопировать код
UILabel: Простейшее отображение 🖼️
UITextView: Визуализация расширенного HTML-содержимого 🖼️🖼️

Вот как можно отобразить HTML в UILabel или UITextView:

swift
Скопировать код
let label = UILabel()
label.attributedText = ... // Вставьте сюда нашу 🖼️

let textView = UITextView()
textView.attributedText = ... // Или сюда для более полного отображения 🖼️🖼️

Работа со сложным HTML-содержимым в UITextView

Применение сложных текстовых эффектов

Если требуется сложная стилизация текста, откажитесь в пользу UITextView, которая поддерживает форматирование, ссылки и изображения.

Применение индивидуального CSS стиля в NSAttributedString

Конструкция NSAttributedString позволяет вписать CSS прямо в HTML-код, что существенно расширяет возможности настройки внешнего вида:

swift
Скопировать код
let htmlCSSString = """
<style>
    /* Кто сказал, что системные шрифты уже не в моде? */
    body { font-family: '-apple-system', 'HelveticaNeue'; }
    .customColor { color: #ff0000; } /* Добавим красного, зачем нет? */
</style>
<b class='customColor'>Теперь жирный текст и красный!</b>
"""

Масштабирование UITextView и включение пользовательского взаимодействия

Настроим UITextView так, чтобы он соответствовал различным размерам экрана и обеспечивал возможность взаимодействия с пользователем:

swift
Скопировать код
textView.isEditable = false // Только для чтения.
textView.isScrollEnabled = true // Пользователь может прокручивать текст.
textView.textContainerInset = UIEdgeInsets(top: 10, left: 10, bottom: 10, right: 10) // Добавим немного свободного пространства для лучшей читаемости.

Поддержка HTML-структуры при конвертации в NSAttributedString

Настройка окружения для работы со сложным HTML-содержимым

Чтобы при конвертации HTML в NSAttributedString сохранялась исходная структура HTML, уделите внимание поддержке разнообразных HTML-атрибутов.

Применение изменяемого NSAttributedString для динамического обновления

NSMutableAttributedString будет полезен в ситуациях, когда информация в документе может меняться:

swift
Скопировать код
if let mutableAttrString = attributedString as? NSMutableAttributedString {
    mutableAttrString.addAttributes([.foregroundColor: UIColor.blue], range: NSMakeRange(0, mutableAttrString.length))
    textView.attributedText = mutableAttrString
}

Надежное преобразование из HTML в NSAttributedString

Создание переиспользуемых функций для конвертации

Дублирование – это зло, поэтому для преобразования HTML в NSAttributedString всегда следует использовать функции или расширения.

Обработка ошибок конвертации

При программировании неожиданности – наше всё, так что всегда отлавливайте исключения с помощью блока do-catch или оператора try?:

swift
Скопировать код
do {
    let attributedString = try NSAttributedString(data: data, options: [.documentType: NSAttributedString.DocumentType.html], documentAttributes: nil)
    textView.attributedText = attributedString
} catch let error as NSError {
    print("Произошла ошибка при анализе HTML: \(error.localizedDescription)")
}

Полезные материалы

  1. NSAttributedString | Документация Apple — прекрасная основа для работы со стилизованным текстом в Swift.
  2. UITextView | Документация Apple — универсальная подплатформа для отображения многострочного текста в Swift.
  3. UILabel | Документация Apple — пример простоты визуализации текста.
  4. Swift String Cheat Sheet — полезное справочное пособие по работе со строками в Swift.
  5. Medium — занимательная статья об интеграции HTML-контента и интерфейсов на Swift.