この文字列拡張はSOのどこかにあり、htmlコードを属性付き文字列に変換できます。
func html2AttributedString() -> NSAttributedString {
return try! NSAttributedString(data: self.data(using: String.Encoding.unicode, allowLossyConversion: true)!, options: [NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType], documentAttributes: nil)
}
Swift 3では正常に機能しましたが、Swift 4ではXcodeが不満を述べています:
タイプ「NSAttributedString.DocumentAttributeKey」の値を、予想されるディクショナリキータイプ「NSAttributedString.DocumentReadingOptionKey」に変換できません
どうすれば修正できますか?
利用可能なNSAttributedString DocumentType オプションのいずれかを渡す必要があります。
ハイパーテキストマークアップ言語(HTML)ドキュメント。
static let html: NSAttributedString.DocumentType
プレーンテキストドキュメント。
static let plain: NSAttributedString.DocumentType
リッチテキスト形式のドキュメント。
static let rtf: NSAttributedString.DocumentType
添付文書付きのリッチテキスト形式。
static let rtfd: NSAttributedString.DocumentType
この場合、最初の(html)NSAttributedString.DocumentType.html
を渡す必要があります
したがって、拡張子 pdated to Swift 4は次のようになります。
extension NSAttributedString {
convenience init(data: Data, documentType: DocumentType, encoding: String.Encoding = .utf8) throws {
try self.init(data: data,
options: [.documentType: documentType,
.characterEncoding: encoding.rawValue],
documentAttributes: nil)
}
convenience init(html data: Data) throws {
try self.init(data: data, documentType: .html)
}
convenience init(txt data: Data) throws {
try self.init(data: data, documentType: .plain)
}
convenience init(rtf data: Data) throws {
try self.init(data: data, documentType: .rtf)
}
convenience init(rtfd data: Data) throws {
try self.init(data: data, documentType: .rtfd)
}
}
extension StringProtocol {
var data: Data { return Data(utf8) }
var htmlToAttributedString: NSAttributedString? {
do {
return try .init(html: data)
} catch {
print("html error:", error)
return nil
}
}
var htmlDataToString: String? {
return htmlToAttributedString?.string
}
}
extension Data {
var htmlToAttributedString: NSAttributedString? {
do {
return try .init(html: self)
} catch {
print("html error:", error)
return nil
}
}
}
遊び場テスト
let htmlString = "<style type=\"text/css\">#red{color:#F00}#green{color:#0F0}#blue{color: #00F; font-weight: Bold; font-size: 32}</style><span id=\"red\" >Red</span><span id=\"green\" > Green </span><span id=\"blue\">Blue</span>"
let htmlData = Data(htmlString.utf8)
htmlString.htmlToAttributedString
htmlData.htmlToAttributedString
解説HTMLインポーターは、バックグラウンドスレッドから呼び出さないでください(つまり、オプションディクショナリには、htmlの値を持つdocumentTypeが含まれます)。メインスレッドとの同期、失敗、およびタイムアウトを試みます。メインスレッドから呼び出すと機能します(ただし、HTMLに外部リソースへの参照が含まれている場合は、タイムアウトする可能性があります。これは、どうしても避けてください)。 HTMLインポートメカニズムは、一般的なHTMLインポートではなく、マークダウン(テキストスタイル、色など)のようなものを実装するためのものです。
Swift 4への自動変換後にこれがありました。4から変更することで修正されました。
NSMutableAttributedString(data: data,
options: [NSAttributedString.DocumentAttributeKey.documentType : NSAttributedString.DocumentType.html],
documentAttributes: nil)
に:
NSMutableAttributedString(data: data,
options: [.documentType : NSAttributedString.DocumentType.html],
documentAttributes: nil) {
これは私のために働く:
let attrStr = try! NSAttributedString(
data: modifiedFont.data(using: .unicode, allowLossyConversion: true)!,
options:[.documentType: NSAttributedString.DocumentType.html,
.characterEncoding: String.Encoding.utf8.rawValue],
documentAttributes: nil)
追加しない場合
.characterEncoding:String.Encoding.utf8 .rawValue
アプリがクラッシュします。
Swift 4:理由はわかりませんが、すべての回答にはコンパイラエラーがあります。だから私はこの拡張を使用します:
extension String {
var html2AttributedString: NSAttributedString? {
do {
return try NSAttributedString(data: data(using: String.Encoding(rawValue: String.Encoding.utf8.rawValue))!,
options: [.documentType: NSAttributedString.DocumentType.html,
.characterEncoding: String.Encoding.utf8.rawValue],
documentAttributes: nil)
} catch {
print("error: ", error)
return nil
}
}
var html2String: String {
return html2AttributedString?.string ?? ""
}
}
使い方 ?
mylable.text = htmlVariable.html2String
HTML文字列の場合、NSAttributedString.DocumentType.html
が正しいオプションです。
extension String {
var utfData: Data? {
return self.data(using: .utf8)
}
var htmlAttributedString: NSAttributedString? {
guard let data = self.utfData else {
return nil
}
do {
return try NSAttributedString(data: data,
options: [
NSAttributedString.documentType: NSAttributedString.DocumentType.html,
NSAttributedString.characterEncoding: String.Encoding.utf8.rawValue
], documentAttributes: nil)
} catch {
print(error.localizedDescription)
return nil
}
}
}
NSAttributedString.DocumentType.html
を使用
NSMutableAttributedString(data: data, options: [.documentType: NSAttributedString.DocumentType.html] , documentAttributes: nil)
NSAttributedStringKeyを使用していますが、Swift 4で同様のエラー「型の値を変換できません」がありました。
let TextStroke: [NSAttributedStringKey : Any] = [
NSAttributedStringKey(rawValue: NSAttributedStringKey.strokeColor.rawValue) : UIColor.black,
NSAttributedStringKey(rawValue: NSAttributedStringKey.foregroundColor.rawValue) : UIColor.white,
NSAttributedStringKey(rawValue: NSAttributedStringKey.strokeWidth.rawValue) : -6.0,]
そして、これはテキストに属性を追加する方法です:
myLabel.attributedText = NSAttributedString(string: myString, attributes: TextStroke)