"Отображение HTML в UILabel или UITextView на Swift"
Пройдите тест, узнайте какой профессии подходите
Swift-решение для базового HTML
За отображение HTML в Swift отвечает NSAttributedString
:
// Этот подход лучше, чем использование обычной 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
.
Многострочное содержимое в UILabel
Необходимо многострочное содержимое в UILabel
? Просто задайте числовое значение 0 для свойства label.numberOfLines
и позвольте UILabel
самому осуществлять расчет размера контента:
let label = UILabel()
label.numberOfLines = 0 // Позволим тексту быть многострочным
label.attributedText = attributedString // Применим полученный ранее текст
Повторное использование с помощью методов расширения
Чтобы избежать дублирования кода, создайте расширение для класса String
:
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()
Визуализация
Есть такая простая истина: "Чем проще, тем лучше":
UILabel: Простейшее отображение 🖼️
UITextView: Визуализация расширенного HTML-содержимого 🖼️🖼️
Вот как можно отобразить HTML в UILabel
или UITextView
:
let label = UILabel()
label.attributedText = ... // Вставьте сюда нашу 🖼️
let textView = UITextView()
textView.attributedText = ... // Или сюда для более полного отображения 🖼️🖼️
Работа со сложным HTML-содержимым в UITextView
Применение сложных текстовых эффектов
Если требуется сложная стилизация текста, откажитесь в пользу UITextView
, которая поддерживает форматирование, ссылки и изображения.
Применение индивидуального CSS стиля в NSAttributedString
Конструкция NSAttributedString
позволяет вписать CSS прямо в HTML-код, что существенно расширяет возможности настройки внешнего вида:
let htmlCSSString = """
<style>
/* Кто сказал, что системные шрифты уже не в моде? */
body { font-family: '-apple-system', 'HelveticaNeue'; }
.customColor { color: #ff0000; } /* Добавим красного, зачем нет? */
</style>
<b class='customColor'>Теперь жирный текст и красный!</b>
"""
Масштабирование UITextView и включение пользовательского взаимодействия
Настроим UITextView
так, чтобы он соответствовал различным размерам экрана и обеспечивал возможность взаимодействия с пользователем:
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
будет полезен в ситуациях, когда информация в документе может меняться:
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?
:
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)")
}
Полезные материалы
- NSAttributedString | Документация Apple — прекрасная основа для работы со стилизованным текстом в Swift.
- UITextView | Документация Apple — универсальная подплатформа для отображения многострочного текста в Swift.
- UILabel | Документация Apple — пример простоты визуализации текста.
- Swift String Cheat Sheet — полезное справочное пособие по работе со строками в Swift.
- Medium — занимательная статья об интеграции HTML-контента и интерфейсов на Swift.