Меняем шрифт при парсинге HTML в NSAttributedText на iOS

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

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

Быстрый ответ

Для установки шрифта при трансформации HTML в NSAttributedText следует применить класс NSAttributedString, который предоставляет возможность анализа HTML напрямую. Пример кода на Swift представлен ниже:

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 были активны.

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

Изменение стилей в различных версиях Swift

Swift активно развивается, и методы настройки шрифтов в разных версиях отличаются:

  • В Swift 3.0 и iOS 9+ используйте .documentType как NSDocumentTypeDocumentAttribute и .characterEncoding как NSCharacterEncodingDocumentAttribute.
  • В Swift 2 для настройки шрифтов применяются иные методы: .documentType и .characterEncoding заменяются на NSUnicodeStringEncoding и NSHTMLTextDocumentType.

Кастомизация HTML с помощью Swift

Если требуется привнести в HTML-код дополнительные стили, можно применить тег <style> для указания основного шрифта:

swift
Скопировать код
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 как подбор элегантного наряда для торжества:

Markdown
Скопировать код
📄 Исходный HTML: <h1>Добро пожаловать на вечеринку!</h1>

Одним действием мы меняем "одежду" слов:

swift
Скопировать код
let attributes = [NSAttributedString.Key.font: UIFont.systemFont(ofSize: 20)]

И вуаля, наши слова преобразовались:

Markdown
Скопировать код
🎩👔 "Добро пожаловать на вечеринку!" преобразился в шрифт размером 20.

👉 Результат? Текст становится настолько же завораживающим, как выглядит красная дорожка на великолепном мероприятии.

Настройка NSMutableAttributedString

Использование UIFontDescriptor

Для подстройки текста под конкретные требования UIFontDescriptor окажется крайне полезным. Он позволит сделать текст более выразительным:

swift
Скопировать код
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 для поиска и изменения шрифтов:

swift
Скопировать код
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 в идеальном состоянии:

swift
Скопировать код
do {
    let attributedString = try NSAttributedString(data: htmlData, options: [.documentType: NSAttributedString.DocumentType.html], documentAttributes: nil)
} catch {
    print("Ошибка при обработке HTML: \(error)")
}

О нет, кажется, HTML не подготовился должным образом!

Инкапсулирование в расширение

Добавьте расширение для UILabel или UITextView, чтобы упростить вставку HTML-содержимого со шрифтами и реализовывать повторное использование вашего кода:

swift
Скопировать код
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>:

HTML
Скопировать код
<span style="font-family: 'your-font-family'; font-size: your-font-size;">Текст здесь...</span>

И каждый тег <span> станет уникальным!

Динамические стили с помощью интерполяции строк

При необходимости в гибкой настройке размеров шрифтов, прибегните к интерполяции строк Swift:

swift
Скопировать код
let fontSize = 17
let fontFamily = "HelveticaNeue"
let styleString = "<style>body { font-family: '\(fontFamily)'; font-size: \(fontSize)px; }</style>"

Это будто у вас есть свой личный портной всегда под рукой!

Эффективное перечисление атрибутов

Для эффективного сканирования больших документов без потери производительности используйте флаг NSAttributedStringEnumerationLongestEffectiveRangeNotRequired.

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

  1. NSAttributedString | Apple Developer Documentation – официальная документация Apple по NSAttributedString.
  2. Core Text Tutorial for iOS: Making a Magazine App | Kodeco – обучающее руководство по использованию Core Text с атрибутированными строками в iOS-приложениях.
  3. Medium – материал по работе с атрибутированными строками на Swift.
  4. Demystify SwiftUI – WWDC21 – Videos – Apple Developer – видеосессия WWDC на тему атрибутированных строк и их использования в SwiftUI.
  5. GitHub Gist: Parse HTML to NSAttributedString – пример кода для преобразования HTML в атрибутированные строки.