Увеличьте размер шрифта NSMutabelAttributedString без изменения форматирования html [duplicate]

Если вы показываете дочернюю форму как модальное диалоговое окно, вы можете установить свойство DialogResult дочерней формы со значением из перечисления DialogResult, которое, в свою очередь, скрывает модальное диалоговое окно и возвращает управление вызывающей форме. В это время родитель может получить данные дочерней формы, чтобы получить необходимую информацию.

Для получения дополнительной информации проверьте эту ссылку: http://msdn.microsoft.com/en-us/library/ system.windows.forms.form.dialogresult (v = vs.110) .aspx [/ д2]

5
задан Jacobo Koenig 1 January 2017 в 03:26
поделиться

5 ответов

SetAttributes сбрасывает все атрибуты из HTML. Я написал метод расширения, чтобы избежать этого:

Swift 4

public convenience init?(HTMLString html: String, font: UIFont? = nil) throws {
    let options : [NSAttributedString.DocumentReadingOptionKey : Any] =
        [NSAttributedString.DocumentReadingOptionKey.documentType: NSAttributedString.DocumentType.html,
         NSAttributedString.DocumentReadingOptionKey.characterEncoding: String.Encoding.utf8.rawValue]

    guard let data = html.data(using: .utf8, allowLossyConversion: true) else {
        throw NSError(domain: "Parse Error", code: 0, userInfo: nil)
    }

    if let font = font {
        guard let attr = try? NSMutableAttributedString(data: data, options: options, documentAttributes: nil) else {
            throw NSError(domain: "Parse Error", code: 0, userInfo: nil)
        }
        var attrs = attr.attributes(at: 0, effectiveRange: nil)
        attrs[NSAttributedStringKey.font] = font
        attr.setAttributes(attrs, range: NSRange(location: 0, length: attr.length))
        self.init(attributedString: attr)
    } else {
        try? self.init(data: data, options: options, documentAttributes: nil)
    }
}

Тестовый образец:

let html = "<html><body><h1 style=\"color:red;\">html text here</h1></body></html>"
let font = UIFont.systemFont(ofSize: 16)

var attr = try NSMutableAttributedString(HTMLString: html, font: nil)
var attrs = attr?.attributes(at: 0, effectiveRange: nil)
attrs?[NSAttributedStringKey.font] as? UIFont
// print: <UICTFont: 0x7ff19fd0a530> font-family: "TimesNewRomanPS-BoldMT"; font-weight: bold; font-style: normal; font-size: 24.00pt

attr = try NSMutableAttributedString(HTMLString: html, font: font)
attrs = attr?.attributes(at: 0, effectiveRange: nil)
attrs?[NSAttributedStringKey.font] as? UIFont
// print: <UICTFont: 0x7f8c0cc04620> font-family: ".SFUIText"; font-weight: normal; font-style: normal; font-size: 16.00pt
6
ответ дан markshiz 17 August 2018 в 09:21
поделиться
  • 1
    Пожалуйста, измените "текст & quot; в расширении для "html". Это сделает ответ полным и правильным. – Jacobo Koenig 2 January 2017 в 23:00
  • 2
    @JacoboKoenig спасибо за указание этой ошибки. Обновлено. – bubuxu 3 January 2017 в 02:23
  • 3
    @bubuxu, я вижу тот же журнал (правильный семейство шрифтов, тип шрифта и т. д.), как вы упомянули здесь, но когда я устанавливаю attr в UILabel, он не работает. – Harsh4789 27 June 2018 в 09:45

версия Swift 3 моего предыдущего (Swift 4) решения


extension NSAttributedString {

    convenience init(htmlString html: String, font: UIFont? = nil, useDocumentFontSize: Bool = true) throws {
        let options: [String : Any] = [
            NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType,
            NSCharacterEncodingDocumentAttribute: String.Encoding.utf8.rawValue
        ]

        let data = html.data(using: .utf8, allowLossyConversion: true)
        guard (data != nil), let fontFamily = font?.familyName, let attr = try? NSMutableAttributedString(data: data!, options: options, documentAttributes: nil) else {
            try self.init(data: data ?? Data(html.utf8), options: options, documentAttributes: nil)
            return
        }

        let fontSize: CGFloat? = useDocumentFontSize ? nil : font!.pointSize
        let range = NSRange(location: 0, length: attr.length)
        attr.enumerateAttribute(NSFontAttributeName, in: range, options: .longestEffectiveRangeNotRequired) { attrib, range, _ in
            if let htmlFont = attrib as? UIFont {
                let traits = htmlFont.fontDescriptor.symbolicTraits
                var descrip = htmlFont.fontDescriptor.withFamily(fontFamily)

                if (traits.rawValue & UIFontDescriptorSymbolicTraits.traitBold.rawValue) != 0 {
                    descrip = descrip.withSymbolicTraits(.traitBold)!
                }

                if (traits.rawValue & UIFontDescriptorSymbolicTraits.traitItalic.rawValue) != 0 {
                    descrip = descrip.withSymbolicTraits(.traitItalic)!
                }

                attr.addAttribute(NSFontAttributeName, value: UIFont(descriptor: descrip, size: fontSize ?? htmlFont.pointSize), range: range)
            }
        }

        self.init(attributedString: attr)
    }

}
5
ответ дан AamirR 17 August 2018 в 09:21
поделиться
  • 1
    Я получаю 'DocumentReadingOptionKey' is unavailable in Swift. С тех пор они заменили его чем-то другим? Поиск в Google не появляется. – keverly 20 February 2018 в 00:00
  • 2
    @keverly Как упоминалось Swift 4 solution (см. первую строку), и вы используете Swift 3.x, пожалуйста, проверьте мой новый ответ на эквивалент Swift 3 – AamirR 20 February 2018 в 10:11
  • 3
    Спасибо за ответ. Я только спросил, потому что я пошел в "Project & quot; - & GT; & quot; Build Settings & quot; - & GT; «Быстрая версия языка» и он говорит 4. Должен быть другой вопрос, хотя. – keverly 21 February 2018 в 05:47
  • 4
    он также работает для быстрых 3.2 и Xcode 9.2 (Y) хорошая работа – Ourang-Zeb Khan 15 August 2018 в 08:54
let font = UIFont(name: fontName, size: fontSize)
textAttributes[NSFontAttributeName] = font
self.attributedText = NSAttributedString(string: self.text, attributes: textAttributes)
-1
ответ дан FelixSFD 17 August 2018 в 09:21
поделиться

Что вы хотите сделать, в основном, превратить NSAttributedString в NSMutableAttributedString.

let attributedT = // ... attributed string
let mutableT = NSMutableAttributedString(attributedString:attributedT)

Теперь вы можете вызвать addAttributes , чтобы применить атрибуты, такие как другой шрифт, в любом желаемом диапазоне, например, все это.

Однако, к сожалению, шрифт без символической черты, такой как курсив, представляет собой другой шрифт из шрифта с этим символическим признаком. Поэтому вам понадобится утилита, которая копирует существующие символические черты из шрифта и применяет их к другому шрифту:

func applyTraitsFromFont(_ f1: UIFont, to f2: UIFont) -> UIFont? {
    let t = f1.fontDescriptor.symbolicTraits
    if let fd = f2.fontDescriptor.withSymbolicTraits(t) {
        return UIFont.init(descriptor: fd, size: 0)
    }
    return nil
}

Хорошо, поэтому, вооружившись этой утилитой, давайте попробуем. Я начну с простого HTML-кода и преобразую его в атрибутную строку, как вы это делаете:

let html = "<p>Hello <i>world</i>, hello</p>"
let data = html.data(using: .utf8)!
let att = try! NSAttributedString.init(
    data: data, options: [NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType],
    documentAttributes: nil)
let matt = NSMutableAttributedString(attributedString:att)

Как вы можете видеть, я перешел в NSMutableAttributedString, как я вам посоветовал. Теперь я буду циклически выполнять стили в терминах шрифта, изменяясь на другой шрифт, используя мою утилиту для применения существующих признаков:

matt.enumerateAttribute(
    NSFontAttributeName,
    in:NSMakeRange(0,matt.length),
    options:.longestEffectiveRangeNotRequired) { value, range, stop in
        let f1 = value as! UIFont
        let f2 = UIFont(name:"Georgia", size:20)!
        if let f3 = applyTraitsFromFont(f1, to:f2) {
            matt.addAttribute(
                NSFontAttributeName, value:f3, range:range)
        }
    }

Вот результат:

Очевидно, вы могли бы настроить эту процедуру еще более сложной, в зависимости от ваших потребностей в дизайне.

13
ответ дан matt 17 August 2018 в 09:21
поделиться
  • 1
    SetAttributes сбрасывает все атрибуты из HTML. – bubuxu 1 January 2017 в 04:17
  • 2
    Правильно, я имел в виду addAttributes. Исправлено. Спасибо, что поймал это. – matt 1 January 2017 в 04:26
  • 3
    Хорошо, исправил мой ответ, чтобы он действительно работал. :) – matt 2 January 2017 в 18:17
  • 4
    Я использую этот метод. Я столкнулся с проблемой. Всякий раз, когда я передаю пользовательский шрифт, добавленный в мое приложение: let f2 = UIFont (name: & quot; Georgia & quot ;, size: 20)! , Стиль шрифта не работает, но размер работает. Он работает с семействами шрифтов, которые находятся в xcode. – SNarula 14 March 2017 в 14:24
  • 5
    @SNarula Если у вас есть вопрос, задайте вопрос . – matt 14 March 2017 в 14:57
7
ответ дан AamirR 6 September 2018 в 07:02
поделиться