проблема атрибутивной строки в iOS 13 - PullRequest
0 голосов
/ 06 марта 2020

Я использую расширение ниже, чтобы преобразовать строку HTML в атрибутивную строку, чтобы отобразить атрибутивную строку, которую я использую UILabel. Семейство шрифтов системно-регулярное с точками 15/18 для iPhone / iPad соответственно. В приведенных выше Imgs, Описание - это заголовок, а приписанная строка - это значение.

extension NSAttributedString {

    internal convenience init?(html: String, font : UIFont) {

        let modifiedFont = String(format:"<span style=\"font-family: '-apple-system', '\(font.fontName)'; font-size: \(font.pointSize)\">%@</span>", html)

        guard let data = modifiedFont.data(using: String.Encoding.utf16, allowLossyConversion: false) else {
            return nil
        }

        guard let attributedString = try? NSMutableAttributedString(data: data, options: [NSAttributedString.DocumentReadingOptionKey.documentType: NSAttributedString.DocumentType.html], documentAttributes: nil) else {
            return nil
        }

        self.init(attributedString: attributedString)
    }
}

консольная печать переменных в указанном выше расширении

(lldb) po html
"<p><font size=\"2\">Pack Size: 2.5 Gal x 2</font></p><p><font size=\"2\">Gallons per case / bucket / barrel:</font></p><p><font size=\"2\">1 Case – 5.0 Gal<br>&nbsp;2 Cases – 10.0 Gal<br>&nbsp;3 Cases – 15.0 Gal</font></p>"

(lldb) po font
<UICTFont: 0x7ffbe4b03a20> font-family: ".SFUI-Regular"; font-weight: normal; font-style: normal; font-size: 15.00pt


(lldb) po modifiedFont
"<span style=\"font-family: \'-apple-system\', \'.SFUI-Regular\'; font-size: 15.0\"><p><font size=\"2\">Pack Size: 2.5 Gal x 2</font></p><p><font size=\"2\">Gallons per case / bucket / barrel:</font></p><p><font size=\"2\">1 Case – 5.0 Gal<br>&nbsp;2 Cases – 10.0 Gal<br>&nbsp;3 Cases – 15.0 Gal</font></p></span>"

Я вызываю добавочный номер, как показано ниже

self.lblValueDescription.attributedText = NSAttributedString(html: data.descriptionField,
                                                                     font: self.lblValueDescription.font)

Вывод в iOS 12

enter image description here

Выход в iOS 13

enter image description here

Проблема:

  1. Размер шрифта не совпадает с ожидаемым в iOS12
  2. В iOS13 есть несколько инопланетных символов с одинаковой строкой html.

Ответы [ 2 ]

1 голос
/ 06 марта 2020

Попробуйте это решение, оно работает как на ios 12, так и на моей стороне 13. Это может помочь вам.

extension String
{
 func htmlAttributed(family: String?, size: CGFloat, colorHex: String) -> NSAttributedString?
  {
    do {
        let htmlCSSString = "<style>" +
            "html *" +
            "{" +
            "font-size: \(size)pt !important;" +
             "color: " + "\(colorHex)" + " !important;" +
            "font-family: \(family ?? "Helvetica"), Helvetica !important;" +
        "}</style> \(self)"

        guard let data = htmlCSSString.data(using: String.Encoding.utf8) else {
            return nil
        }

        return try NSAttributedString(data: data,
                                      options: [.documentType: NSAttributedString.DocumentType.html,
                                                .characterEncoding: String.Encoding.utf8.rawValue],
                                      documentAttributes: nil)
    } catch {
        print("error: ", error)
        return nil
    }
  }
}

И установить текст этой строкой

 self.lblValueDescription.attributedText = yourHtmlString.htmlAttributed(family: "Roboto-Regular", size: 11,colorHex: "#000000")!

Редактировать:

После проверки ответ, который я сделал ниже, изменился

 let modifiedFont = String(format:"<style>html *{font-family: '-apple-system', '\(font.fontName)' !important; font-size: \(font.pointSize) !important}</style>%@", html)
  • Изменить тег стиля с помощью блока стиля
  • * Добавлен флаг 1019 * для принудительного применения стиля.
0 голосов
/ 06 марта 2020

Пахнет несоответствием кодирования / декодирования. Вы явно указываете utf16 для своей кодировки данных. Однако из-за этого у вас могут быть конфликтующие кодировки. Это также объясняет искаженные символы и проблему iOS 12 против 13.

...