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> 2 Cases – 10.0 Gal<br> 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> 2 Cases – 10.0 Gal<br> 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
Wyjście w iOS 13
Problem:
- Rozmiar czcionki różni się od oczekiwanego w iOS12
- iOS13 ma kilka obcych znaków z tym samym ciągiem html.
2 odpowiedzi
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.
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.
Podobne pytania
Nowe pytania
ios
iOS to mobilny system operacyjny działający na urządzeniach Apple iPhone, iPod touch i iPad. Użyj tego tagu [ios] w przypadku pytań związanych z programowaniem na platformie iOS. Użyj powiązanych tagów [objective-c] i [swift] w przypadku problemów specyficznych dla tych języków programowania.