« 食品競う問題 | トップページ | さらに1年2ヶ月8日が経過した »

2010.09.23

Core Textで縦書きを

 iOSにも3.2からCore Textが導入された。よって、縦書きが簡単にできるのだろう、と思ったのだが… 結論。できない。
 だが、Core Textや縦書きに関してあまりにも参照できるところが少ないので、ここ数日で知り得た事を書いておく。

 Core Textの日本語資料というものは皆無なので、手さぐりでやっていくしかない。例えば、"Core Text 縦書き"でググると、MOSAが2年前に開いたセミナーがひっかかる。まさに欲しいのはコレ。この技術なのだが、今となっては知る由もない。
 簡単なところでは、Appleのサンプル"CoreTextTest"が理解の助けになる。

 これを見ていくと、CTFramesetterRefというのに各種アトリビュートをセットして、CTFrameRefとか、CTLineRefとかいうのを作って描画すればいいことがわかる。で、各種アトリビュート名からヘッダファイルを探っていくと、kCTFrameProgressionAttributeNameとkCTVerticalFormsAttributeNameというのがひっかかる。実験してわかったが、前者は縦書きにした際の行の送り方向を決定し、後者は文字を90度回転させる事ができる。この2つを組み合わせれば縦書きが実現できる。
 縦書きのグリフを選ばなければならないのではないか、と思っていたが、アトリビュートの設定だけで自動的に縦書きグリフが選択される。素晴らしい。
 注意点は、kCTVerticalFormsAttributeNameは通常のアトリビュートとしてCTFrameSetterRefで設定するのだが、kCTFrameProgressionAttributeNameはCTFrameRefを作る関数CTFramesetterCreateFrame()の第4引数に、CFDictionaryRefに格納してセットしなければならんということだ。これはどこのサンプルにも書いてなかったので、kCTFrameProgressionAttributeNameをググってソースコードを探してやり方を見つけた。

 Mac OS X(Cocoa)の場合、これだけで縦書きが完了する。だが、iOSの場合はそうはいかない。kCTVerticalFormsAttributeNameの定義を見るとこうなっている。

extern const CFStringRef kCTVerticalFormsAttributeName CT_AVAILABLE_STARTING( __MAC_10_5, __IPHONE_NA);

Mac OS Xでは実装されているが、iOSでは実装されていないのだ。これがCore Textで簡単に縦書きが実現できない理由だ。

 もう1文字単位で描画するしか方法がないのかもしれない。その方法は今夜から探す。

※この記事には続きがある。2011年5月10日に書かれた。

|

« 食品競う問題 | トップページ | さらに1年2ヶ月8日が経過した »

コメント

縦書き、いいよね。
ルビや傍点や割り注なんかもあるの?
IE には独自仕様で縦書きがあるらしいけど、
もっと広く扱えたらいいのに。
そういや、HTML5 はどうなんだろう。

投稿: Tabby | 2010.09.23 23:30

 機能が多すぎてよくわからん。あらゆるアトリビュートが範囲を持って(2文字目から7文字分、とか)設定できる。これを使えばワープロソフトとかの表示部分は全部まかなえるのだろう。

投稿: をかのゆ | 2010.09.24 11:02

コメントを書く



(ウェブ上には掲載しません)




トラックバック


この記事へのトラックバック一覧です: Core Textで縦書きを:

« 食品競う問題 | トップページ | さらに1年2ヶ月8日が経過した »