运行时自动布局的 UIButton 大小

Posted

技术标签:

【中文标题】运行时自动布局的 UIButton 大小【英文标题】:UIButton size with Autolayout at runtime 【发布时间】:2015-05-01 17:23:54 【问题描述】:

我已经找到了几个关于此的问题,但我还没有找到关于如何真正做到这一点的可靠答案,所以我希望这不是因为没有找到具体答案而重复。

这是我的问题:我正在重写一个旧的 ios 应用程序,它有一个带有自定义单元格的表格视图,并且在每个单元格内都有一个单一颜色的按钮。 按钮的宽度是在运行时计算的,以显示每个单元格的每个按钮的宽度不同,从而创建看起来像边图的东西。

我想要/需要做同样的事情,但我的项目已经完成了自动布局,我需要它在 iPhone 和 iPad 上都可以工作,所以此时删除自动布局会很痛苦。

由于自动布局,我的单元格的布局带有约束,当所有单元格的宽度相同时它看起来很好,但我还没有想出一种方法让它在运行时改变它的宽度。

这也是另一个问题,来自我在 SO 上找到的问题。

这是我的单元格在运行时的样子:

我需要中间的这个按钮(蓝色的东西)保持在团队名称和值的中间,并且右侧的值必须保持在相同的位置(所以不要向左移动如果条形图很小)。

对此问题的任何建议将不胜感激。 谢谢!

【问题讨论】:

我可能忽略了一些细节,但您不能将 Button 的中心设置为单元格的中心吗? myButton.center = cell.center? 【参考方案1】:

同时给按钮 centerX 和 centerY 约束;这将保持在中间。给它一个固定的宽度,并为该约束创建一个 IBOutlet,以便您可以在代码中更新其常量值以修改条形的宽度。团队名称标签的左边缘应该有一个约束,值标签的右边缘应该有一个;这将使它们在所有屏幕尺寸上保持原位。

以表格视图控制器中的这段代码为例,

- (void)viewDidLoad 
    [super viewDidLoad];
    self.theData = @[@@"name":@"One", @"value": @6094, @"width": @200, @@"name":@"Two", @"value": @210, @"width": @20, @@"name":@"Three", @"value": @7075, @"width": @250, @@"name":@"Four", @"value": @6648, @"width": @225, @@"name":@"Five", @"value": @2300, @"width": @100, @@"name":@"Six", @"value": @900, @"width": @50];
    [self.tableView reloadData];



- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
    return self.theData.count;



- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 

    RDTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath];
    cell.leftLabel.text = self.theData[indexPath.row][@"name"];
    cell.rightLabel.text = [NSString stringWithFormat:@"%@",  self.theData[indexPath.row][@"value"]];
    cell.widthCon.constant = [self.theData[indexPath.row][@"width"] floatValue];
    return cell;

给出了这个结果,

【讨论】:

谢谢。关于如何在代码中执行此操作的任何建议? @TooManyEduardos 您需要使用 constraintWithItem:attribute:relatedBy:toItem:attribute:multiplier:constant: 来制作居中约束。您可以使用它或 constraintsWithVisualFormat:options:metrics:views: 来为两个标签制作约束。反正你为什么要做代码,在IB里设置起来更容易。 因为每个按钮在运行时都需要自己的宽度,所以一个需要有 30 的宽度,另一个需要有 200 的宽度......依此类推,而我拥有的值是一个 int所以我需要将位置的相对性分配给特定的数字 @TooManyEduardos 无论您是在代码中还是在 IB 中进行约束,这都无关紧要。正如我所说,您为宽度约束创建一个 IBOutlet,然后在 cellForRowAtIndexPath 中设置该约束的常量值。 是的。抱歉,约束是在 IB 中进行的,但我需要在运行时修改按钮的宽度。我曾经使用按钮的框架大小来做到这一点,但现在我认为我需要修改现有的约束以使按钮在运行时更宽或更薄。对吗?

以上是关于运行时自动布局的 UIButton 大小的主要内容,如果未能解决你的问题,请参考以下文章

无法设置启用自动布局的 UIButton 框架的大小

stackView swift中uibutton问题的自动布局/宽度

自动布局中的 UIButton 动态宽度

自动布局为 UIButton 拉伸选定的图像

只需要修复 UIButton 和 UILabel 的自动布局问题

使用自动布局在屏幕更改时调整自定义单元格中的 UIButton 字体