1

以下のコードを使用して 200 個のボタンをループアウトし、行がいっぱいになると行が 1 段階下がるようにします。私のやり方はうまくいかないので、もっと良い方法があるに違いないと思います。

2 行目と 3 行目が始まると、ボタンは 1 つしかありません。最後の行で互いにボタンを押すだけでエラーは発生しません。

-(void)viewDidLoad {
int numba=0;
int x=-20;
int y=20;

for(int i = 1; i <= 200; ++i) {


    numba ++;


    if (numba <16) {

        x =x+20;

    } else if (numba >16 && numba <26){
        x=-20;
        x = x + 20;
        y=40;

    } else if (numba >26 && numba <36){
        x=-20;
        x =x+20;
        y=60;

    } else {
        x=-20;
        x =x+20;
        y=80;
    }



    UIButton * btn = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    btn.frame = CGRectMake(x, y, 20, 20);


    NSLog(@"numba = %d",numba);
    NSLog(@"x = %d",x);




    btn.tag = numba;
    [btn setTitle:[NSString stringWithFormat: @"%d", numba] forState:UIControlStateNormal];

    [self.view addSubview:btn];


    }

}

4

1 に答える 1

0
  1. 2 次元のグリッドを作成する場合は、単一のループで賢くしようとするのではなく、ネストされたループを使用するのが最善です。

  2. コード全体に定数をまき散らさないでください。メソッドまたは関数で記号定数を定義できます。

これが私がそれを行う方法です:

- (void)viewDidLoad {
    static const CGFloat ButtonWidth = 20;
    static const CGFloat ButtonHeight = 20;
    static const CGFloat RowWidth = 320;

    int buttonNumber = 0;

    for (CGFloat y = 0; buttonNumber < 200; y += ButtonHeight) {
        for (CGFloat x = 0; buttonNumber < 200 && x + ButtonWidth <= RowWidth; x += ButtonWidth) {
            ++buttonNumber;
            UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect];
            button.frame = CGRectMake(x, y, ButtonWidth, ButtonHeight);
            button.tag = buttonNumber;
            [button setTtle:[NSString stringWithFormat:@"%d", buttonNumber] forState:UIControlStateNormal];
            [self.view addSubview:button];
        }
    }
}
于 2012-02-10T23:22:26.810 に答える