2011年2月21日月曜日

Cocoa ObjC Spin(その3) removeFromSuperview

Spacesの環境設定が変わったとき、どのようにSpinの表示も変えるか、という話。Notificationがらみの部分は後日。(自分用の備忘録という性格が強いblogなので、誰も知りたくないようなメモが続く(^^;))

とりあえず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 件のコメント:

コメントを投稿