2011年2月20日日曜日

Cocoa ObjC Spin(その2)

超小物アプリなので、大枠は本日できあがった。さんざん書き散らかした実験用コードのカットアンドペーストが多かったのですぐに基本的な部分はできあがったが・・・。

とりあえずの実行画面はこんな感じ。


現在アクティブなWorkspaceだけ色を変えて表示してみた。これをスクリーンのどこかにおいてマウスをころころするとなかなかいい具合。


Workspace1つにつき、SpacesViewと名付けたViewを1つ割り振っている。それをaddSubviewしている、と。Viewなのでイベント処理とかが楽にできるだろう、という目算。

現在のところの問題点は

Spacesの設定が変わったあとの処理

これはWarpのソースを読みながら該当する箇所をカットアンドペーストして、エラーがでないように修正して、という感じでけっこうさくさく実装できた。しかし、

a,設定が変わったら、いったん全部のsubviewを「remveFormSuperview」で削除する
b,それから新しく「Workspaceの総数」分のsubviewをaddする

という手順をとったところ、aの段階でものすごい時間がかかることが判明した。コンソール出力はこんな感じになる。

2011-02-20 21:15:36.032 Spin[7077:a0f] *** Collection was mutated while being enumerated.CFArray 0x100121540 [0x7fff70429ee0]{type = mutable-small, count = 7, values = (
0 : SpacesView: 0x1001276e0
1 : SpacesView: 0x102a13a10
2 : SpacesView: 0x102a13680
3 : SpacesView: 0x102a13ac0
4 : SpacesView: 0x10050d320
5 : SpacesView: 0x102700090
6 : SpacesView: 0x102a13e50
)}
2011-02-20 21:15:36.034 Spin[7077:a0f] Call ConfigChange!
2011-02-20 21:15:36.034 Spin[7077:a0f] remove No2
2011-02-20 21:15:36.035 Spin[7077:a0f] *** Collection was mutated while being enumerated.CFArray 0x100121540 [0x7fff70429ee0]{type = mutable-small, count = 6, values = (
0 : SpacesView: 0x102a13a10
1 : SpacesView: 0x102a13680
2 : SpacesView: 0x102a13ac0
3 : SpacesView: 0x10050d320
4 : SpacesView: 0x102700090
5 : SpacesView: 0x102a13e50
)}
2011-02-20 21:15:37.911 Spin[7077:a0f] Call ConfigChange!
2011-02-20 21:15:37.911 Spin[7077:a0f] remove No3
2011-02-20 21:15:37.911 Spin[7077:a0f] *** Collection was mutated while being enumerated.CFArray 0x100121540 [0x7fff70429ee0]{type = mutable-small, count = 5, values = (
0 : SpacesView: 0x102a13680
1 : SpacesView: 0x102a13ac0
2 : SpacesView: 0x10050d320
3 : SpacesView: 0x102700090
4 : SpacesView: 0x102a13e50
)}
(tagとみなされるので、引用中の半角<>は全部削除してあります)
1つのsubviewをremoveFromSuperviewするたびに、viewを収めていたMutableArrayが切り詰められている様子。ひとつ切り詰めるたびに1秒近くかかっている。

変だなあ、なにかおかしなことしているのかなあ。
時間はかかるけど、処理そのものはエラーがでるわけでもなく、時間がかかったあとは正常に動作する。こういうのがいちばん厄介だ。
一応明日以降の方針としては、「Workspaceが増えた場合は単純にsubviewを増やすだけ」、「Workspaceが減った場合は、減った分のsubviewだけ削除してあとは残す」という感じで実装してみる。Spacesの設定変更は滅多に行われないけれど、こういう部分がやはりプログラミングの肝、と自分では考える。ここらをていねいに作ってこそ、プログラミングの勉強になるんだな。

見た目(^^;)
すてきな見た目を作るにはどーしたらいいんだろう。現在ののっぺりした感じをもっとかっこよくするにはどうしたらいいのか研究する。

ウィンドウのサイズ変更
現在、ウィンドウそのものは非表示の透明にしている。当然サイズ変更はできない。サイズ変更したい時だけウィンドウ枠を表示するようにするか?(これは簡単。コンテキストメニューとかでそういう項目を作ればいいだけ)

それともViewを直接サイズ変更して、それに連動してウィンドウも大きさを変えるようにするか?(こっちは難しそう)

移動は[window setMovableByWindowBackground:YES];としているのでマウスでドラッグすれば大丈夫。

という感じで今日は目がしくしく痛くなるまでiMacの前でXcodeを触っていた。楽しいなあ。

0 件のコメント:

コメントを投稿