Używam poniższego rozszerzenia, aby przekonwertować ciąg HTML na przypisany ciąg, aby renderować przypisany ciąg, którego używam UILabel. Rodzina czcionek jest regularna systemowo z punktami 15/18 dla iPhone / iPad odp. W powyższych obrazach Opis to podpis, a przypisany ciąg to wartość.

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)
    }
}

Wypisuje w konsoli zmienne w powyższym rozszerzeniu

(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>"

Dzwonię na numer wewnętrzny jak poniżej

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

Wyjście w iOS 12

wprowadź opis obrazu tutaj

Wyjście w iOS 13

wprowadź opis obrazu tutaj

Problem:

  1. Rozmiar czcionki różni się od oczekiwanego w iOS12
  2. iOS13 ma kilka obcych znaków z tym samym ciągiem html.
0
dahiya_boy 6 marzec 2020, 09:04

2 odpowiedzi

Najlepsza odpowiedź

Wypróbuj to rozwiązanie, które działa na obu ios 12 i 13 po mojej stronie, może ci pomóc.

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
    }
  }
}

I ustaw tekst według tej linii

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

Edytuj:

Po przejrzeniu odpowiedzi wprowadziłem poniżej zmiany

 let modifiedFont = String(format:"<style>html *{font-family: '-apple-system', '\(font.fontName)' !important; font-size: \(font.pointSize) !important}</style>%@", html)
  • Zmień oznaczenie stylu za pomocą bloku stylu
  • Dodano flagę !important, aby wymusić zastosowanie stylu.
2
Jignesh mayani 7 marzec 2020, 05:06

To pachnie niezgodnością kodowania / dekodowania. Wyraźnie określasz utf16 jako kodowanie danych. Jednak to może powodować konflikty kodowań. To również wyjaśniałoby zniekształcone postacie i problem iOS 12 vs 13.

0
olx 6 marzec 2020, 08:07