先日、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 を設定するなら、そちらの方法がいいかも。