読者です 読者をやめる 読者になる 読者になる

プログラミングノート

一からものを作ることが好きなエンジニアの開発ブログです。

複数ボタンを配置する

しばらく触っていなかったのでちょっと忘れ気味なiPhoneです..


ボタンに限らず、複数の同じパーツを設置する場合によく使うのでメモ。
もっとこうした方がよいよみたいなことがあればつっこみお願いします。


まずはNSMutableArrayを用意します。

@interface MyView : UIView {
  NSMutableArray *buttons;
}
@property (nonatomic, retain) NSMutableArray *buttons;
- (void)buttonClicked:(id)sender;
@end


UIButtonを作成するタイミングでNSMutableArrayに追加しておきます。
クリックされた場合の判定に利用するのでtagも設定します。

@implementation MyView
@synthesize buttons;

- (id)initWithFrame:(CGRect)frame {
  if (self = [super initWithFrame:frame]) {
    buttons = [[NSMutableArray alloc] initWithCapacity:0];
    for(int i=0; i<10; i++){
      UIButton *tmp = [UIButton buttonWithType:UIButtonTypeRoundedRect];
      [tmp setTitle:[NSString stringWithFormat:@"%i",i] forState:UIControlStateNormal];
      [tmp addTarget:self action:@selector(buttonClicked:) forControlEvents:UIControlEventTouchUpInside];
      tmp.frame = CGRectMake(110, 20+i*35, 100, 30);
      tmp.tag = i;
      [self addSubview:tmp];        
      [buttons addObject:tmp];
    }    
  }
  return self;
}


ボタンがクリックされたら(id)senderから該当ボタンのタグを取得します。
(@selector()で引数を渡す方法が分からない..)


設置済みのボタンを参照する場合は、NSMutableArrayから取り出して利用します。
ここではクリックされたボタン以外を画面外にランダムな角度を付けて落下させてます。

- (void)buttonClicked:(id)sender{
  
  srand(time(nil));

  UIButton *b = (UIButton *)sender;
  int targetId = b.tag;

  CGContextRef context = UIGraphicsGetCurrentContext();
  [UIView beginAnimations:nil context:context];
  [UIView setAnimationDuration:0.5];
    
  for(int i=0; i<10; i++){
    if(i == targetId) continue;

    UIButton *tmp = (UIButton *)[buttons objectAtIndex:i];
    CGRect rect = tmp.frame;
    rect.origin.y = 600;
    tmp.frame = rect;
    
    int rnd = rand() % 60;
    if((rand() % 2) == 1){
      rnd *= -1;
    }
    [tmp setTransform:CGAffineTransformMakeRotation(rnd * (M_PI/180.0))];    
  }
  [UIView commitAnimations];
}

- (void)drawRect:(CGRect)rect {
}

- (void)dealloc {
  [buttons release];
  [super dealloc];
}
@end