先日、HTML 文字列を NSAttributedString に変換する方法を書いた。
NSAttributedString を UILabel の attributedText にセットするだけで、
お手軽に HTML を表示できるけど、UILabel は描画が非常に遅い。
UIWebView と同じか、少しマシかも、ってくらいには待たされる。
記事のサマリー程度でこの遅さ、ちょっと使えない。
実用的な速度で NSAttributedString を描画するライブラリを探してみたところ、
DTCoreText というのが良さそうだった。
低レイヤー API の CoreText を使って、ビューに直接テキストを描画するライブラリ。
例えば、DTCoreText が提供する DTAttributedTextView を使うことで、
self.attributedTextView = DTAttributedTextView(frame: self.view.bounds)
self.view.addSubview(self.attributedTextView)
let html = "<h1><a href=\"http://tnakamura.hatenablog.com\">Title</a></h1>"
+ "<ul>"
+ "<li><strong>Item1</strong></li>"
+ "<li><i>Item2</i></li>"
+ "</ul>"
let data = html.dataUsingEncoding(
NSUTF8StringEncoding, allowLossyConversion: true)
let attrStr = NSAttributedString(HTMLData: data, documentAttributes: nil)
self.attributedTextView.attributedString = attrStr
HTML を画面いっぱいに表示することができる。速度も気にならない。
今回はコードで直接サブビューに追加したけど、DTAttributedTextView は UIScrollView を継承しているので、
Storyboard に UIScrollView を貼り付けてカスタムクラスを指定する方法でも使える。
AutoLayout を設定するなら、そちらの方法がいいかも。