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

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

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

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

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

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

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

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

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

【问题讨论】:

  • 我可能忽略了一些细节,但您不能将 Button 的中心设置为单元格的中心吗? myButton.center = cell.center?

标签: ios objective-c uitableview autolayout nslayoutconstraint


【解决方案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 中进行的,但我需要在运行时修改按钮的宽度。我曾经使用按钮的框架大小来做到这一点,但现在我认为我需要修改现有的约束以使按钮在运行时更宽或更薄。对吗?
猜你喜欢
  • 2016-06-04
  • 2013-04-30
  • 1970-01-01
  • 2014-07-13
  • 1970-01-01
  • 1970-01-01
  • 2013-07-21
  • 1970-01-01
  • 2016-02-24
相关资源
最近更新 更多