ページ

2009年3月21日土曜日

β版バグ修正 - マルチスクリーン(ウィンドウ)

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク

スクリーン配置によってウィンドウキャプチャも表示が変になっているのに気が付いた。

例えば上にサブ画面、下にメイン画面があった場合。


ウィンドウキャプチャを起動すると下の画面のウィンドウが選択状態になるのだが、上のサブ画面に選択ウィンドウの画像が表示されてしまう。


これは以前調査した通り座標系の問題。
β版バグ修正 - マルチスクリーン(その2)
http://xcatsan.blogspot.com/2009/03/blog-post_06.html

内部的にウィンドウを管理している座標系が CGWindowなのに対して、ウィンドウを描画する座標系がカスタムビューのローカル座標であるのが原因。CGWindow系からローカル座標系へ変換してやればいいだろう。
以前、ローカル座標系からCGWindow系へ変換するメソッド #convertFromLocalToCGWindowPoint: を用意した。ここでは下記の数式を使っていた。

・スクリーン座標系上での全画面範囲(左下)-(右上):(sx1, sy1)-(sx2, xy2)
・メイン画面のサイズ(幅・高さ):(sw, sh)
・ローカル座標系上でキャプチャした範囲選択の開始点(左上):(lx1, ly1)
・CGWindow関数へ渡す開始点(左上):(cx1,cy1)

cx1 = lx1 + sx1
cy1 = ly1 - (sy2 - sh)



この最後数式を入れ替えれば逆変換になる。

lx1 = cx1 - sx1
ly1 = cy1 + (sy2 - sh)


この変換を行うメソッド #convertFromCGWindowPointToLocal: を用意し、これを使うように修正してみた。

- (NSPoint)convertFromCGWindowPointToLocal:(NSPoint)from_p
{
CGFloat cx1, cy1, lx1, ly1, sx1, sy2;
NSRect frame = [[Screen defaultScreen] frame];
NSRect m_frame = [[NSScreen mainScreen] frame];

CGFloat sh = m_frame.size.height;
cx1 = from_p.x;
cy1 = from_p.y;
sx1 = frame.origin.x;
sy2 = frame.origin.y + frame.size.height;

lx1 = cx1 - sx1;
ly1 = cy1 + (sy2 - sh);

return NSMakePoint(lx1, ly1);
}



実行してみる。


今度は大丈夫だ。

ただボタンの位置がおかしい??

2009年3月20日金曜日

β版バグ修正 - マルチスクリーン(マウスカーソル)

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク

久しぶりにマルチスクリーン関連の不具合修正を行った。

マウスカーソルがキャプチャに含まれていなかった。
これはカーソル位置計算時に使っているスクリーンサイズがマルチを考慮していなかった為。

@implementation MouseCursor

- (NSPoint)convertPoint:(NSPoint)point
{
NSRect rect = [[NSScreen mainScreen] frame];
:


Screenクラスで置き換える。
 NSRect rect = [[Screen defaultScreen] frame];


出た。

2009年3月19日木曜日

ローカライズ(その5)

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク

試しに nib に新しくメニューアイテムを追加してみる。


ibtool で English.proj/MainMenu.nib.strings を生成する。

すると新しい ObjectIDが発行され、最後に項目が追加されていた。


これを手作業で Japanese.proj/MainMenu.nib.strings へマージ&翻訳する作業が必要ということか。

逆に項目を削除したら Japanese.proj/MainMenu.nib.strings を削除しないといけない。

Nibファイルを修正する時は常にこの辺りを意識しないと駄目みたいだ。

- - -
ObjectIDとかのメタ情報を使えばマージを楽にするツールが作れそうだ。
と、考えるのは私1人じゃないはずなので、既にツールがありそうだが。

2009年3月18日水曜日

ローカライズ(その4)

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク

ふと思ったのだが nibを変更したり項目を追加した場合の他言語のメンテナンスはどうやるんだろうか?

昨日の方法のおさらいをしてみる。

(1) 最初に ibtoolを使い MainMenu.nib から文字列だけを抜き出したファイル English.proj/MainMenu.nib.strings を生成した。

(2) 次にローカリゼーションを追加して Japanese.proj/MainMenu.nib.strings を作成し、これを日本語に書き換えた。

(3) 最後に Japanse.proj/MainMenu.nib.strings から Japanese.lproj/MainMenu.nib を作成した。



この状態で InterfaceBuidlerを使い English.proj/MainMenu.nibを変更したとする。
その場合 (1)までは良いが、その後はどうやって変更分を日本語へ反映させるのか?

もしかして手作業でマージのような処理が必要とか?
むむ?

2009年3月17日火曜日

ローカライズ(その3)

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク

katokichi さんより nib(xib) についてローカライズの情報をもらった。

2008/11/6 iPhone SDK勉強会 まとめ
http://iphone-dev.jp/modules/pico/index.php?content_id=9


UIをローカライズする手順
http://d.hatena.ne.jp/uasi/20081115/1226676887


なるほど ibtool というツールを使うと文言の翻訳だけで対応できるらしい。

他にもいくつか解説ページがあった。

ibtoolによるnibファイルのローカライズ
http://www.fraction.jp/log/archives/2008/01/23/localize_nib_file_with_ibtool


試してみよう。

(1) ターミナルを開き、Xcodeのプロジェクトディレクトリへ移動する。
(2) ibtool を実行する。

 ibtool --generate-stringsfile English.lproj/MainMenu.nib.strings English.lproj/MainMenu.nib




すると English.lproj フォルダ配下に MainMenu.nib.strings が生成される。


(3) Xcodeプロジェクトへ追加する。
コンテキストメニューで追加するか、ドラッグ&ドロップで生成されたファイル MainMenu.nib.string をプロジェクトへ追加する。


この時、エンコーディングを Unicode(UTF-16)にしておく。


そうでないとこんな感じで化け化けになる。



(4) このファイルにさらにローカライズを追加する。追加するのは "Japanese"。
"MainMenu.nib.string"の上でコンテキストメニューを表示し「情報を見る」でダイアログを開く。ここで画面下の「ローカリゼーションの追加」ボタンを押す。





ファイルの中身はこんな感じ。



(5) 少し書き換えてみる。



(6) nibを生成する前に MainMenu.nib にローカリゼーション"Japanese"を追加しておく。



(7) さて書き換えたファイルを元に nibファイルを生成する。
ibtool --write Japanese.lproj/MainMenu.nib -d Japanese.lproj/MainMenu.nib.strings English.lproj/MainMenu.nib


ターミナルで実行。


Japanese.lproj フォルダを見ると MainMenu.nibが生成されている。



(8) ビルドして実行する。
さてどうだろう。

おお出た。

- - - -
この辺りの一連の作業はビルドに組み込んで自動化できるらしい。後で試してみよう。
それにしても量が多い。。

2009年3月16日月曜日

ローカライズ(その2)

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク

方法がわかったのでやってみる。

まずターゲットの nibファイルの情報を見る。


左下の「ローカリゼーションを追加」ボタンを押し、"Japanese"を追加する。


すると" Japanese"が作られる。


InterfaceBuilderを立ち上げてメニューを日本語に書き換えてみた。


実行してみる。こんな感じ。


少し雰囲気が変わった。

- - - -
方法はわかったけれど、今後Nibファイルを追加・変更するたびに全言語分対応しなければならないということか。アウトレット接続やBindingsを考えるとこれは大変だな。何かうまい方法は無いだろうか。

2009年3月15日日曜日

ローカライズ(その1)

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク

マルチスクリーンが片付いてきたのでそろそろ最後の作業であるローカライズに取りかかる。

プログラム中で使う文字列はすでに全て英語と日本語を用意してある。





残るはnibファイルのローカライズ。メニューやプリファレンスパネルの日本語用リソースを用意する必要がある。
現在は英語のみ。



(ツールバーの表記が日本語になっているのはプログラムで表示している為)

nibファイルのローカライズは初めてだ。どうやるんだ。
というところで時間切れ。また明日。