Меняем шрифт при парсинге HTML в NSAttributedText на iOS
Быстрый ответ
Для установки шрифта при трансформации HTML в NSAttributedText следует применить класс NSAttributedString
, который предоставляет возможность анализа HTML напрямую. Пример кода на Swift представлен ниже:
let htmlData = "<p>Ваш HTML здесь...</p>".data(using: .utf8)!
let attributes: [NSAttributedString.Key: Any] = [.font: UIFont.systemFont(ofSize: 17)]
if let attributedString = try? NSAttributedString(data: htmlData, options: [.documentType: NSAttributedString.DocumentType.html], documentAttributes: nil).mutableCopy() as? NSMutableAttributedString {
attributedString.addAttributes(attributes, range: NSRange(location: 0, length: attributedString.length))
// Используйте объект `attributedString`
}
Примечание: Встроенные стили HTML могут мешать настройкам шрифта, поэтому рекомендуется удалить
font-size
иfont-family
из HTML, чтобы настройки шрифта в Swift были активны.
Изменение стилей в различных версиях Swift
Swift активно развивается, и методы настройки шрифтов в разных версиях отличаются:
- В Swift 3.0 и iOS 9+ используйте
.documentType
какNSDocumentTypeDocumentAttribute
и.characterEncoding
какNSCharacterEncodingDocumentAttribute
. - В Swift 2 для настройки шрифтов применяются иные методы:
.documentType
и.characterEncoding
заменяются наNSUnicodeStringEncoding
иNSHTMLTextDocumentType
.
Кастомизация HTML с помощью Swift
Если требуется привнести в HTML-код дополнительные стили, можно применить тег <style>
для указания основного шрифта:
let htmlString = """
<style>
body { font-family: '-apple-system', 'HelveticaNeue'; font-size: 17px; }
</style>
<p>Ваш HTML здесь...</p>
"""
let htmlData = htmlString.data(using: String.Encoding.utf8)!
let attributedString = try? NSAttributedString(data: htmlData, options: [.documentType: NSAttributedString.DocumentType.html], documentAttributes: nil)
Воспользуйтесь этим кодом, чтобы стать настоящим мастером стилей в Swift.
Визуализация
Рассматривайте процесс установки шрифта в NSAttributedText как подбор элегантного наряда для торжества:
📄 Исходный HTML: <h1>Добро пожаловать на вечеринку!</h1>
Одним действием мы меняем "одежду" слов:
let attributes = [NSAttributedString.Key.font: UIFont.systemFont(ofSize: 20)]
И вуаля, наши слова преобразовались:
🎩👔 "Добро пожаловать на вечеринку!" преобразился в шрифт размером 20.
👉 Результат? Текст становится настолько же завораживающим, как выглядит красная дорожка на великолепном мероприятии.
Настройка NSMutableAttributedString
Использование UIFontDescriptor
Для подстройки текста под конкретные требования UIFontDescriptor
окажется крайне полезным. Он позволит сделать текст более выразительным:
let fontDescriptor = UIFont.systemFont(ofSize: 17).fontDescriptor.withSymbolicTraits(.traitBold)
let boldFont = UIFont(descriptor: fontDescriptor!, size: 17)
let boldAttributes: [NSAttributedString.Key: Any] = [.font: boldFont]
attributedString.addAttributes(boldAttributes, range: boldRange)
Благодаря такому подходу ваш текст выйдет на новый уровень восприятия!
Поиск и обновление атрибутов
Чтобы обновить атрибуты NSAttributedString
, воспользуйтесь методом enumerateAttribute
для поиска и изменения шрифтов:
attributedString?.enumerateAttribute(.font, in: NSMakeRange(0, (attributedString?.length)!), options: []) { (value, range, stop) in
if let oldFont = value as? UIFont {
let newFont = oldFont.withSize(20) // Меняем размер шрифта.
attributedString?.addAttribute(.font, value: newFont, range: range)
}
}
Это позволяет манипулировать атрибутами с высокой точностью и лёгкостью.
Финальный аккорд: обработка ошибок
Для избежание внезапных проблем, следует улучшить обработку ошибок. Важно гарантировать, что ваш HTML в идеальном состоянии:
do {
let attributedString = try NSAttributedString(data: htmlData, options: [.documentType: NSAttributedString.DocumentType.html], documentAttributes: nil)
} catch {
print("Ошибка при обработке HTML: \(error)")
}
О нет, кажется, HTML не подготовился должным образом!
Инкапсулирование в расширение
Добавьте расширение для UILabel
или UITextView
, чтобы упростить вставку HTML-содержимого со шрифтами и реализовывать повторное использование вашего кода:
extension UILabel {
func setHTML(_ html: String, fontSize: CGFloat) {
guard let data = html.data(using: .utf8) else { return }
do {
let attributedText = try NSAttributedString(data: data, options: [.documentType: NSAttributedString.DocumentType.html, .characterEncoding: String.Encoding.utf8.rawValue], documentAttributes: nil)
self.attributedText = attributedText
} catch {
print("Не удалось применить HTML: \(error)")
}
}
}
Вот как можно просто и эффективно с этим справиться!
Кастомизация отдельных HTML-элементов
Применение инлайн-стиля
Для стилизации конкретных элементов HTML можно вставить инлайн CSS в теги <span>
:
<span style="font-family: 'your-font-family'; font-size: your-font-size;">Текст здесь...</span>
И каждый тег
<span>
станет уникальным!
Динамические стили с помощью интерполяции строк
При необходимости в гибкой настройке размеров шрифтов, прибегните к интерполяции строк Swift:
let fontSize = 17
let fontFamily = "HelveticaNeue"
let styleString = "<style>body { font-family: '\(fontFamily)'; font-size: \(fontSize)px; }</style>"
Это будто у вас есть свой личный портной всегда под рукой!
Эффективное перечисление атрибутов
Для эффективного сканирования больших документов без потери производительности используйте флаг NSAttributedStringEnumerationLongestEffectiveRangeNotRequired
.
Полезные материалы
- NSAttributedString | Apple Developer Documentation – официальная документация Apple по
NSAttributedString
. - Core Text Tutorial for iOS: Making a Magazine App | Kodeco – обучающее руководство по использованию Core Text с атрибутированными строками в iOS-приложениях.
- Medium – материал по работе с атрибутированными строками на Swift.
- Demystify SwiftUI – WWDC21 – Videos – Apple Developer – видеосессия WWDC на тему атрибутированных строк и их использования в SwiftUI.
- GitHub Gist: Parse HTML to NSAttributedString – пример кода для преобразования HTML в атрибутированные строки.