使用iOS的两个参数生成按钮网格

我需要为iOS应用生成一个按钮网格。 每个按钮都需要两个参数:列数和行数。 按钮还将具有两种状态:激活和停用。

当应用程序加载时,我希望有21行和16列。 屏幕上的某个位置还会有一个显示“添加列”的按钮,每次单击时会添加4个额外的列。

有什么建议我应该这样做吗? 我可以先用IB添加第一个21 * 16按钮但这样可以让我稍后用额外的列扩展它,以及如何?

编辑:赏金只是开始奖励mbm30075,没有必要的新答案

我相信这是一个更完整的解决方案。 这是我为测试编写的.h / .m对:

ViewController.h

#import  @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] 

这可以使用滚动视图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个循环以编程方式添加按钮。 另外,为了识别按钮,为它们分配标签,这些标签是由列号和行号组合而成的号码。 例如: – 第1行和第1列的按钮可以标记为11.使用标记值可以识别单击的按钮并执行相应的操作。