NSParagraphStyleはiOS6だとlineHeightを解釈できない。
iOS7だとNSAttributedString
が主となっていて、今までのtext
プロパティは使わない方が良いみたいな風潮があるっぽい?
その辺でハマる人がでそうなので記述しておく。
UIKitはWebKitから派生しているので、NSAttributedString
のような属性テキストは、NSHTMLWriter
が内部的にHTMLに変換処理を掛けて表示している。
UITextView
に、HTMLを渡すとそれを解釈して表示するcontentToHTMLString
や、CSSの形式で外観を変更できるstyleString
のような隠しプロパティ(使うとリジェクトされる)が存在するのも、その辺りに由来しているのだと思われる。
それならば、lineHeight
を操作することなど造作もないのでは?と考えたくなる。
NSParagraphStyle
に行間周りのプロパティがあるので、これをNSAttributedString
に設定すれば終わり、…かと思いきやlineHeight
系のプロパティは全て無視される。
原因は前述したNSHTMLWriter
のバグとのこと。
iOS7でこのバグは治ったのだけど、移行率がどうなるやら。
iOS6で真面目にこの問題に対処するならば、描画をCoreTextで行い、テキスト入力部を自作することになるだろう。CoreTextの描画はNSHTMLWriter
とは別系統なのか、NSParagraphStyle
の指定を正確に解釈してくれる。
自作のViewに対してテキスト入力をどう実装するかは、Appleの公式SampleソースのSimpleTextInputが参考になるけれど、今見たら引退済ドキュメントなので今後の開発に参考にすべきではない、というような旨が書いてある。
ついでにこのサンプル、レガシー以前の問題として、日本語が混じるとまともに機能しなかった気がする。また、iOSのシステム上で「変換中のテキスト」がどういう扱いになっているのかブラックボックスなので、手を出さない方が無難な感はある。
iOS7での変更
iOS6まではCore Textフレームワーク上にWeb Kitフレームワークがあり、UIWebView
とUITextView
を実装していた。
iOS7ではText Kitが追加され、UITextView
はWebKitから切り離された。レンダリング方法もOSXのCocoaに近い方法に変更されたため、もはやNSHTMLWriter
は利用していないと思われる。
iOS6以前の対応が必要な場合に、頭の片隅に入れておくといいのかもしれない。