DTCoreText で NSAttributedString を高速に描画

先日、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 を画面いっぱいに表示することができる。速度も気にならない。

f:id:griefworker:20141127065245p:plain

今回はコードで直接サブビューに追加したけど、DTAttributedTextView は UIScrollView を継承しているので、 Storyboard に UIScrollView を貼り付けてカスタムクラスを指定する方法でも使える。 AutoLayout を設定するなら、そちらの方法がいいかも。