使用 NSArray 中的 UIButtons 自动填充滚动视图

Posted

技术标签:

【中文标题】使用 NSArray 中的 UIButtons 自动填充滚动视图【英文标题】:Auto Fill scrollview with UIButtons from NSArray 【发布时间】:2014-05-31 13:53:12 【问题描述】:

我需要填充一个视图,使其成为 UIButtons 中 NSArray 对象的内容,并且如果按钮的数量不适合要滚动的视图。例如,如果 array.count 是 25 并且只适合 20 个按钮,4 列 5 行,剩余的 5 个按钮将通过滚动显示。

我目前正在测试它:

    UIScrollView *sv = [[UIScrollView alloc] initWithFrame:CGRectMake(20, 20, 728, 984)];
    sv.backgroundColor = [UIColor greenColor];
    sv.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
sv.contentSize = CGSizeMake(PAGE_WIDTH, sv.frame.size.height);
sv.pagingEnabled = YES;
[self.view addSubview:sv]; // assuming a view controller

    NSMutableArray *freeHoursList = [NSMutableArray arrayWithObjects:
                                     [NSString stringWithFormat:@"10"],
                                     [NSString stringWithFormat:@"11"],
                                     [NSString stringWithFormat:@"12"],
                                     [NSString stringWithFormat:@"17"],
                                     [NSString stringWithFormat:@"18"],
                                     [NSString stringWithFormat:@"19"],
                                     [NSString stringWithFormat:@"10"],
                                     [NSString stringWithFormat:@"11"],
                                     [NSString stringWithFormat:@"12"],
                                     [NSString stringWithFormat:@"17"],
                                     [NSString stringWithFormat:@"18"],
                                     [NSString stringWithFormat:@"19"],nil];
for (int i = 0; i < freeHoursList.count; i++)

UIButton *btn = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    btn.backgroundColor = [UIColor redColor];
btn.frame = CGRectMake(i * (BUTTON_WIDTH + BUTTON_PADDING), 10, BUTTON_WIDTH, BUTTON_HEIGHT);
btn.tag = i + MAGIC_BUTTON_TAG_OFFSET; // to relate to the array index
    NSString *numero = [freeHoursList objectAtIndex:i];
[btn setTitle:[NSString stringWithFormat:@"%@",numero]  forState:UIControlStateNormal];
//[btn addTarget:self action:@selector(buttonPressed:) forControlEvents:UIControlEventTouchUpInside];
[sv addSubview:btn];


这就是我得到的:

【问题讨论】:

【参考方案1】:

我会添加变量来跟踪实际 Y 位置和实际列。因此,您将检查下一个按钮是否适合滚动的宽度,如果不适合 - 将列设置为 0 并将 X 添加到按钮 Y 位置。它看起来像这样:

int BUTTON_Y = 10;
int column = 0;
for (int i = 0; i < freeHoursList.count; i++, column++)
       
    if(column*(BUTTON_WIDTH + BUTTON_PADDING) + BUTTON_WIDTH > sv.contentSize.width) 
        BUTTON_Y += BUTTON_HEIGHT;
        column = 0;
    

    UIButton *btn = [UIButton buttonWithType:UIButtonTypeRoundedRect];
        btn.backgroundColor = [UIColor redColor];   
    btn.frame = CGRectMake(column * (BUTTON_WIDTH + BUTTON_PADDING), BUTTON_Y, BUTTON_WIDTH, BUTTON_HEIGHT);
    btn.tag = column + MAGIC_BUTTON_TAG_OFFSET; // to relate to the array index
        NSString *numero = [freeHoursList objectAtIndex:i];
    [btn setTitle:[NSString stringWithFormat:@"%@",numero]  forState:UIControlStateNormal];
    //[btn addTarget:self action:@selector(buttonPressed:) forControlEvents:UIControlEventTouchUpInside];
    [sv addSubview:btn];

【讨论】:

感谢您的回答,但现在我有 6 列按钮,但在最后一列的右侧填充了另外 2 个按钮。 那么你到底想要什么?你现在有什么? 对不起,我认为是因为定义了宽度和高度值... 是的,它正在根据 BUTTON_WITH 和 BUTTON_PADDING 跳到下一行:)

以上是关于使用 NSArray 中的 UIButtons 自动填充滚动视图的主要内容,如果未能解决你的问题,请参考以下文章

在运行时无法更改和自定义自定义 UITableViewCell 中的 UIButtons 的标题

自定义 uitableviewcell 中的 Uibuttons

将 NSArray 中的每个 NSString 元素显示为 UIButton Objective C

将NSArray中的每个NSString元素显示为UIButton Objective C

在 InterfaceOrientation 上的 customCell 中重新定位 UIButtons

如何以编程方式为一组 UIButtons 设置单独的背景图像