Вопрос по ios – Генерация сетки кнопок с двумя параметрами для iOS

2

Мне нужно создать сетку кнопок для приложения iOS. Каждой кнопке нужны два параметра: номер столбца и номер строки. Кнопка также будет иметь два состояния, активированное и деактивированное.

Когда приложение загружено, я хочу, чтобы он был как 21 строка и 16 столбцов. И где-то на экране также будет кнопка с надписью «Добавить столбцы». и это будет добавлять 4 дополнительных столбца при каждом нажатии.

Любые предложения, как я должен это сделать? Я мог бы начать с добавления первых 21 * 16 кнопок с IB, но позволит ли я позже расширить его дополнительными столбцами, и как?

Edit: the bounty was only started to reward mbm30075, no new answers necessary

Ваш Ответ

3   ответа
1

используя 2 цикла. Также для идентификации кнопок назначьте им теги, представляющие собой номер, составленный из комбинации номера столбца и номера строки. Например: - кнопка в строке 1 и столбце 1 может иметь тег 11. Используя значения тегов, вы можете определить, какая кнопка нажата, и выполнить соответствующее действие.

2

UIScrollView и используя дваfor циклы для добавления необходимых кнопок во время выполнения, как

for(int col = 0; col < [max column]; col++)
{
   for(int row = 0; row < [max row]; row++)
   {
      //add buttons assigning them proper frame size
   }
} 
2

что это более полное решение. Вот пара .h / .m, которую я написал для тестирования:

ViewController.h

#import <UIKit/UIKit.h>
@interface ViewController : UIViewController 
@property (assign, nonatomic) int numColumns;
@property (assign, nonatomic) int numRows;
@property (strong, nonatomic) NSMutableArray *buttonsArray;
@property (strong, nonatomic) IBOutlet UIScrollView *scrollView;
@property (strong, nonatomic) IBOutlet UIButton *addButtons;
@property (strong, nonatomic) IBOutlet UIView *buttonsView;
- (IBAction)addFourMoreColumns;
@end

ViewController.m

#import "ViewController.h"
@implementation ViewController
@synthesize addButtons;
@synthesize buttonsArray;
@synthesize buttonsView;
@synthesize numColumns;
@synthesize numRows;
@synthesize scrollView;
- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    [self setButtonsArray:[NSMutableArray array]];
    [self setNumColumns:16];
    [self setNumRows:21];
    [self layoutButtons];
}
- (void)layoutButtons {
    static int width  = 100;
    static int height = 37;
    static int buffer = 8; // space between buttons (horiz. & vert.)
    static int margin = 20;
    CGPoint topLeft = CGPointMake(margin,margin); // standard "top left" in iOS
    // Since you appear to be wanting to modify the number of columns,
    // I'm going to make the multi-dimension array an array of columns, 
    // with each column containing an array of buttons (representing the rows)

    // Iterate through how many columns SHOULD exist ([self numColumns])
    for (int i = 0; i < [self numColumns]; i = i + 1) {
        // Check if this "column" exists (does this index exist in [self buttonsArray]?)
        if (i >= [[self buttonsArray] count]) {
            // It doesn't exist, so we need to add a blank array
            [[self buttonsArray] addObject:[NSMutableArray array]];
        }
        NSMutableArray *column = [[self buttonsArray] objectAtIndex:i];
        // Now, we iterate through how many rows/buttons SHOULD exist ([self numRows])
        for (int j = 0; j < [self numRows]; j = j + 1) {
            // Check if this "row"/"cell"/"button" exists
            if (j >= [column count]) {
                // It doesn't exist, so we need to add a new button AND PLACE IT!
                // Of course, you need to make your button type correctly
                // This is just standard button code...
                UIButton *btn = [UIButton buttonWithType:UIButtonTypeRoundedRect];
                [btn setFrame:CGRectMake(topLeft.x,topLeft.y,width,height)];
                // Do whatever else you need to do with the button...
                // Set title...
                [btn setTitle:[NSString stringWithFormat:@"(%d,%d)", i + 1, j + 1] forState:UIControlStateNormal];
                // Add target actions...
                [btn addTarget:self action:@selector(buttonPressed:) forControlEvents:UIControlEventTouchUpInside];
                // Add the button to the view
                [[self buttonsView] addSubview:btn];
                // Add the button to the array
                [column addObject:btn];
            }
            // Increment topLeft to the next "row" for correct button placement...
            topLeft = CGPointMake(topLeft.x, topLeft.y + height + buffer);
        }
        // Increment topLeft to the next "column" for correct button placement...
        topLeft = CGPointMake(topLeft.x + width + buffer, margin);
    }
    // So, I'm assuming your "add columns" button will be placed equivalent to 
    // "(columnCount + 1, 1)", or at the top of the screen, just to the right
    // of the right-most column of buttons
    // [self addButtons] is the property to the UIButton that calls [self addFourMoreColumns]
    [[self addButtons] setFrame:CGRectMake(topLeft.x, topLeft.y, [[self addButtons] frame].size.width, [[self addButtons] frame].size.height)];
    // Now, update the view that holds the buttons to give it a new size (based on the buttons added)
    CGRect viewFrame = CGRectMake(0, 0, CGRectGetMaxX([[self addButtons] frame]) + buffer, 20 + ([[self buttonsArray] count] * (height + buffer)));
    [[self buttonsView] setFrame:viewFrame];
    [[self scrollView] setContentSize:viewFrame.size];
    // Redraw the view...
    [[self view] setNeedsDisplay];
}
- (IBAction)addFourMoreColumns {
    [self setNumColumns:[self numColumns] + 4];
    [self layoutButtons];
}
// Shows in the log which button you pressed: "(col, row)"
- (void)buttonPressed:(id)sender {
    for (int i = 0; i < [[self buttonsArray] count]; i = i + 1) {
        NSMutableArray *col = [[self buttonsArray] objectAtIndex:i];
        for (int j = 0; j < [col count]; j = j + 1) {
            if (sender == [col objectAtIndex:j]) {
                NSLog(@"button (%d,%d) pressed", i + 1, j + 1);
                break;
            }
        }
    }
}
@end

Настройка Xib является базовой с:

View                 // tied to [ViewController view]
|
--->ScrollView       // tied to [ViewController scrollView]
    |
    --->View         // tied to [ViewController buttonsView]
        |
        --->UIButton // tied to [ViewController addButtons]
Конечно! Дайте мне знать, как это происходит. Это сработало для меня, но дайте мне знать, если вам нужно что-то настроить.
Имеет ли значение, где находится кнопка addButtons? Мне нужно, чтобы он был на том же уровне, что и скроллвью (поэтому вне скроллвью). Также,addButtons следует позвонитьaddFourMoreColumns действие, верно?
Каждый раз, когда я использовалUIScrollView или видел учебник / демо на нем, он всегда размещает другойUIView внутри него. Затем вы устанавливаете[UIScrollView setContentSize:[UIView frame].size];, Возможно, это не единственный способ сделать это, но так, как я всегда делал. Хороший вопрос. Я проверю это сегодня вечером!
Большое спасибо за то, что записали такой полный пример. Я попробую
Да, и еще один вопрос: есть ли какая-то причина, по которой в представлении прокрутки должен быть другой вид? Не могли ли кнопки перейти непосредственно к просмотру прокрутки?

Похожие вопросы