読者です 読者をやめる 読者になる 読者になる

なるようになるかも

力は多くの場合、その人の思いを超えない。

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フレームワークがあり、UIWebViewUITextViewを実装していた。

iOS7ではText Kitが追加され、UITextViewWebKitから切り離された。レンダリング方法もOSXのCocoaに近い方法に変更されたため、もはやNSHTMLWriterは利用していないと思われる。

iOS6以前の対応が必要な場合に、頭の片隅に入れておくといいのかもしれない。

参考

NSParagraphStyle line spacing ignored - Stack Overflow