如何在 UITableView Cell 中以编程方式创建 n 个 UIButton?

Posted

技术标签:

【中文标题】如何在 UITableView Cell 中以编程方式创建 n 个 UIButton?【英文标题】:How to create n number of UIButton programmatically in UITableView Cell? 【发布时间】:2015-11-03 10:38:28 【问题描述】:

我正在尝试创建一个带有 n 个按钮的 UITableView,这取决于后端 JSON 数据。

我附上了一张图片,我知道如何在 UITableViewCell 上创建 UIButtons,但我不知道如何将它们正确放置在 UITableViewCell 中。

UIButtonUITableViewCell

UIButton *continuebtn = [[UIButton alloc]initWithFrame:CGRectMake(10, 100, view1.frame.size.width-20, 40)];
[continuebtn setBackgroundColor:[UIColor grayColor]];
[continuebtn setTitle:@"Continue" forState:UIControlStateNormal];
continuebtn.layer.cornerRadius = 10;
continuebtn.layer.borderWidth =1.0;
continuebtn.layer.borderColor = [UIColor blackColor].CGColor;
[continuebtn setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];

如何在UITableViewCell 上放置“n”个UIButton?? UIButton 宽度取决于它的文字内容

【问题讨论】:

单元格可以水平滚动吗? 不,不是这样,但单元格高度应该增加以自动适应所有按钮..这就是问题 所以你得到的数据是你想添加多少个按钮,比如 3、4、5 等? 每个按钮将被放置为水平板,或者它们将像在集合视图中一样排列? 是的,然后我将使用 for 循环来生成 UIButtons 【参考方案1】:

如果您想在单元格中垂直放置按钮,请使用以下建议:

UITableviewCell 的高度取决于按钮的数量。实现heightForRowAtIndexPath方法如下:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 
    return 100.0f + (buttonsArray.count*buttonHeight+buttonsHeightSeparator);

    //change 100.0f with height that is required for cell without buttons
    //buttonHeight is a static float representing value for height of each button
    //buttonHeightSeparator is a static float representing separation distance between two buttons

在您的cellForRowAtIndexPath 方法中,您可以使用以下代码创建按钮:

for(int i=0; i<buttonsArray.count; i++) 
    UIButton *continuebtn = [[UIButton alloc]initWithFrame:CGRectMake(10, 100+i*(buttonHeight+buttonsHeightSeparator), view1.frame.size.width-20, 40)];
    [continuebtn setBackgroundColor:[UIColor grayColor]];
    [continuebtn setTitle:@"Continue" forState:UIControlStateNormal];
    continuebtn.layer.cornerRadius = 10;
    continuebtn.layer.borderWidth =1.0;
    continuebtn.layer.borderColor = [UIColor blackColor].CGColor;
    [continuebtn setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
    [continuebtn addTarget:self action:@selector(continueBtnPressed:) forControlEvents:UIControlEventTouchUpInside]; //add target to receive button tap event
    [continuebtn setTag:i]; //to identify button
    [cell.contentView addSubview:continuebtn]; //add button to cell

【讨论】:

如果我的 UITableView 单元格中的 UIButton 数量不同,那么应该创建多个部分还是应该检查 UITableview 中的 indexpath.row? heightForRowAtIndexPathcellForRowAtIndexPath 方法中检查 indexPath.row 以在不同的单元格中创建按钮。 这会创建垂直独立于文本大小的按钮【参考方案2】:

我自己找到了更好的答案。 请检查此代码。

  - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
    cell = [tableView dequeueReusableCellWithIdentifier:@"cell" forIndexPath:indexPath];

    [cell addSubview:[self addView:indexPath.row]];
    return cell;



-(UIView *)addView:(NSInteger)row

    UIView *progView;
    progView = [[UIView alloc] initWithFrame:CGRectMake(0, 0,cell.frame.size.width,cell.frame.size.height)];
    progView.backgroundColor = [UIColor grayColor];
    progView.tag = i;    
    progView.autoresizingMask = (UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleTopMargin | UIViewAutoresizingFlexibleBottomMargin);

    int x,y;
    x=10;y=10;
    for(int i=0;i<10;i++)
        UIButton *button = [[UIButton alloc]init];
        NSString *myString=@"Dynamic";
        [button setTitle:myString forState:UIControlStateNormal];
        CGSize stringsize = [myString sizeWithFont:[UIFont systemFontOfSize:14]];
        [button setFrame:CGRectMake(x,y,stringsize.width+40, stringsize.height+20)];
        x+=stringsize.width+50;
        NSLog(@"%d-%f",x,progView.frame.size.width);

        if(x>progView.frame.size.width)
            y+=50;
            x=10;
        

        button.layer.borderWidth =1.0;
        button.layer.borderColor = [UIColor greenColor].CGColor;
        [button setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
        [button setTag:i]; 
        [progView addSubview:button];
    

    return progView;

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath

    return 200;

【讨论】:

返回单元格高度为 200 的恒定值,如果有更多超过 200 大小的按钮,这不会截断您的单元格吗?

以上是关于如何在 UITableView Cell 中以编程方式创建 n 个 UIButton?的主要内容,如果未能解决你的问题,请参考以下文章

在 iOS 中以编程方式对 UITableView 的约束

UITableView自定义Cell中,纯代码编程动态获取高度

如何从按钮单击中获取 UITableview cell.textlabel.text 值?

在 UITableViewController 中以编程方式切换 UITableView

如何在 Swift 4 中以编程方式注册 UITableViewHeaderFooterView?

以编程方式将 UISearchBar 添加到普通 ViewController 中以编程方式添加的 UITableView