Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Best way to build 10x10 grid of UIButtons?

I'm going to have a 10x10 grid of UIButton objects. Each of these UIButtons is going to need to be referenced by the row and column number, so they should probably be stored in some type of an array.

My question: what is the easiest way to create this grid? Programmatically or through the Interface Builder? If programmatically, what would be the easiest way to access these buttons so that when they are touched, I am able to know the row and column number of the touched button?

like image 702
James Skidmore Avatar asked Aug 01 '09 00:08

James Skidmore


2 Answers

I personally don't like IB, so I recommend to do it programmatically!

Use an NSArray to store your UIButton's. Each button's index is row*COLUMNS+column.

Set the tag property to BASE+index (BASE being an arbitrary value > 0) so that you can find a button's position: index=tag-BASE; row=index/COLUMNS; column=index%COLUMNS;

- (void)loadView {
    [super loadView];

    for (NSInteger row = 0; row < ROWS; row++) {
        for (NSInteger col = 0; col < COLS; col++) {
            UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect];
            [buttonArray addObject:button];
            button.tag = BASE + row * COLS + col;
            button.frame = ...;
            [button addTarget:self action:@selector(didPushButton:) forControlEvents:UIControlEventTouchDown];
            [self.view addSubview:button];
        }
    }
}

- (void)didPushButton:(id)sender {
    UIButton *button = (UIButton *)sender;
    NSInteger index = button.tag - BASE;
    NSInteger row = index / COLS;
    NSInteger col = index % COLS;
    // ...
}
like image 122
squelart Avatar answered Oct 18 '22 09:10

squelart


You can use a GridView from the moriarty library to help with layout - positioning each button where you want it. Building partially on squelart's sample code as a createButtonAtRow:col: method, this could work as follows:

GridView* gridview = [[GridView alloc] initWithRows:ROWS cols:COLS];
for (NSInteger row = 0; row < ROWS; ++row) {
  for (NSInteger col = 0; col < COLS; ++col) {
    [gridView addsubView:[self createButtonAtRow:row col:col]];
  }
}
[myView addSubview:gridView];
[gridView release];  // Let myView retain gridView.
like image 8
Tyler Avatar answered Oct 18 '22 07:10

Tyler