とりあえずSpacesの設定が変わったというNotificationを受け取ったら、Spacesの「行と桁」を取得しなおして、それに合わせてsubviewの数も変える。増えただけなら単純に増やしてaddSubviewする。
減った時は、「行と桁」をかけて最大Workspace数を得、「現在のsubviewの数」と比べて減らす。
NSArray *views=[self subviews];
if([views count]>0){
if(spacesMax > [views count]){
for(NSInteger i=[views count];i<spacesMax;i++){
SpacesView *spview=[[SpacesView alloc] initWithFrame:rect spaceNo:i+1];
//NSLog(@"add View:no %d",[spview spaceNo]);
[self addSubview:spview];
[spview release];
}
}else if(spacesMax < [views count]) {
for(NSInteger i=[views count]-1;i>=spacesMax;i--){
SpacesView *spview=[views objectAtIndex:i];
//NSLog(@"remove View:no %d count:%d MAX:%d loop:i:%d",[spview spaceNo],[views count],spacesMax,i);
[spview removeSelf];
}
}
CGSWorkspace currentSpace=[self spaceNumber];
for(NSInteger i=0;i<spacesMax;i++){
if (i==currentSpace-1) {
SpacesView *spview=[views objectAtIndex:i];
[spview setActive:YES];
}
}
}
相変わらず半角<がbloggerに怒られるので全角にしてある。うーん、下手なコードだなー。もう少しきれいに書けるなあ。似たような処理をまとめて他のメソッドにしてしまおう、明日あたり。setActiveは「現在のアクティブなWorkspace」を表すBOOL値。YESなら自分がアクティブ、ということで。多少見た目もいじって現在はこんな感じ。
removeFromSuperviewは実際は「SpacesView」というクラス(subviewになってるクラス)のメソッドで記述している。removeするのをindexの大きい方から(つまり配列の後ろから)やっているので、MutableArrayの作り直しが発生していないようだ。ま、順調に動いている。Spacesの設定をいじってもほぼリアルタイムに反映できるようになった。
次は見た目。グラディーションを使えば少しは見映えがするはず。そう思って「cocoa グラディーション」とググったら、xcatsan師匠の新cocoの最近の記事に行き着いた。なるほどー、こうやるのか。
あと、透明ウィンドウでの、半透明Viewを使ったリサイズ。まだまだ調べることがたくさんある。楽しいなあ。


0 件のコメント:
コメントを投稿