昨日の夜中からiPhone OS Libraryと格闘しておりまして、もちろんちゃんと睡眠はとっていますが、約5時間ほどでNSStringをUIViewに縦書きすることに成功しました!
NDAのせいで詳しく書けないのがアレですが、要はUIViewを継承しdrawRectメソッドをオーバライドし、その中でグラフィックコンテキストに対し、NSStringに実装されているUIStringDrawingプロトコルのdrawAtPointメソッドを使うという方法です。
この方法自体は独創的な方法でも何でもなくて、たぶん普通な方法だと思うのですが、NDAのせいか、いかんせんネット上に情報が少なすぎるのでほかにどういう方法があるのかは今のところ分かりません。
縦書きのアルゴリズム自体はiPhone OS Libraryとは直接関係なく、単に文字のサイズを考慮しながら縦に1文字ずつ描画していってるだけです。
もちろん今回のテストは技術的興味だけではなく目的があってのことです。
AppStoreで配信されたらNDAも緩和されるらしいので、もしそのときが来ればもっと詳しく書こうかなと思います。
出来れば今年中にできたらいいなぁ。
毎日縦書きはどうするのか情報を探していてたどり着きました。
drawAtPointを使うとこまでは分かったのですが、どのように縦に表示させているのでしょうか?
[hoge drawAtPoint:point withFont:font];
で渡して表示は出来たのですが縦に成形する方法がどうしてもわからなくて、もしよろしければどのように表示させたのかお教えくださいませんでしょうか?
コメントありがとうございます。
NDAのことがありますので、敢えて詳しくは書きません。
基本的には文字列を分解して1文字ずつ独自に位置を調節しながら描画するだけです。
綺麗に文字を縦に並べるために1文字ごとの描画サイズを取得する必要がありますが、
その方法については、通常の表示までできたということであれば、sizeWithFont、これをキーワードとしてドキュメントなどを検索するだけですぐに理解していただけるかと。
テストしてみた限りでは、よほどまずい実装をしたり、よほど激しく書き換えしたりしない限りはこの方法でもパフォーマンス的な問題はなさそうでした。
ただし、これだけでは縦書きとしては不完全で、記号など縦書き時に90度回転させなければならない文字を考慮する必要が出てくると思います。
文字の回転まではテストしてないのですが、たぶんグラフィックコンテキストを弄るとか、イメージに書き出したものを90度回転させる(さらにパフォーマンスの事を考えキャッシュしておく)といった考え方で出来ると踏んでいます。
ありがとうございます!
なるほど、CGSizeをとるわけですね。
ふと思ったのですが、一文字ずつ解釈して縦書きを表示するという事は、一文字ごとに改行コードを入れて縦書きとする、という荒技でも同じような気がしてしまったのですが何か勘違いしてますでしょうか。
(考慮しなければならない記号などを除いて)
ところで、NDAって解除されませんでしたっけ?
その事を気になされてるような記事に見受けられましたが解除だったと思ったので・・・
実際にコレを試したのが一ヶ月以上前なので、記憶が定かではないですが、
NSStringのdrawAtPointでは改行コードが反映されなかった(半角スペース分空くだけ?)気がします。
もし、改行コードを入れるだけで縦書きになるとしたら、それはそれでかなり使えますね。
(文字幅の違いによって不揃いになる問題も中央寄せにしておけば露見しづらいかもしれませんし。)
ただ、なぜこの記事で挙げた実装を考えたかというと、
それは縦書き以前に 1文字1文字それぞれに位置を制御したかったからなんです。
具体的にはiPhoneの縦横を持ち替えた時に1文字1文字がイージングしてなめらかに配置が変わることを実現したかったからなんです。
NDAについては僕の思い違いでなければ、NDAが適用されないのはAppStoreでリリース済みのソフトウェアについてだけだったかと思います。
まぁ、AppStoreでリリース済みのソフトウェアは現在は星の数ほどあるわけで、その作者のブログじゃないことを証明するのは(Appleにとっても)難しいでしょうから、バレないっちゃあバレないんでしょうけどね。