今日のコード
import SwiftUI import UIKit struct HTMLTextView: UIViewRepresentable { let htmlContent: String func makeUIView(context: Context) -> UITextView { let textView = UITextView() textView.isEditable = false textView.isScrollEnabled = false textView.backgroundColor = .clear return textView } func updateUIView(_ uiView: UITextView, context: Context) { guard let data = htmlContent.data(using: .utf8) else { uiView.text = "Invalid HTML content" return } let options: [NSAttributedString.DocumentReadingOptionKey: Any] = [ .documentType: NSAttributedString.DocumentType.html, .characterEncoding: String.Encoding.utf8.rawValue ] do { let attributedString = try NSAttributedString(data: data, options: options, documentAttributes: nil) uiView.attributedText = attributedString } catch { uiView.text = "Failed to load HTML content" } } func sizeThatFits(_ proposal: ProposedViewSize, uiView: UITextView, context: Context) -> CGSize? { .init(width: proposal.width ?? 0, height: proposal.height ?? 0) } } struct ContentView: View { let htmlString = """ <h1>Hello, SwiftUI!</h1> <p>This is <b>HTML</b> content displayed in a SwiftUI app.</p> """ var body: some View { ScrollView { HTMLTextView(htmlContent: htmlString) .frame(maxWidth: .infinity, minHeight: 100) .padding() } } }
DocumentReadingOptionKey
というものがあり、ドキュメント読み込む際のオプション(ドキュメントのフォーマット、文字エンコーディング、テキスト方向など)を指定できる。
developer.apple.com
ただ、以下のような注意点の記載があった。
Don’t call this method from a background thread if the options dictionary includes the documentType attribute with a value of html. If you do, the method tries to synchronize with the main thread, fails, and times out. Calling it from the main thread works, but can still time out if the HTML contains references to external resources. The HTML import mechanism is meant for implementing something like markdown (that is, text styles, colors, and so on), not for general HTML import.
developer.apple.com このことから、AttributedStringでのHTML表示は、簡易的な表示でのみ使用することが望ましいような気がした。 複雑なものを表示したいという場合はWebViewを使用することを検討するのも良いかも?
エラーキャッチについても、ちゃんとやろう〜
When reading or writing attributed strings, choose methods that return or throw an error, and check any errors you receive. Handling errors is the best way to detect issues with the import or export process and take corrective action.
意外と簡単に表示できて、良かった🍎
参考
WebViewについて qiita.com