视图宽度无法通过自动布局正确更改

Views width fails to change properly with auto-layout

我在 static cell 中有 4 个 UIButtons,宽度为 constraints,所有 4 个边都有常规约束。

在某个时候,我想更改 constraints 宽度。这是我的代码:

- (void)viewDidLoad {
    [super viewDidLoad];

    self.constraintArray = [[NSArray alloc] initWithObjects:self.budgetWidthConstraint, self.categorieWidthConstraint, self.extraButtonWidthConstraint, nil];
}

- (void)myLayout
{
    CGFloat cellWidth = self.thirdCell.frame.size.width;

    [self.constraintArray[2] setConstant:cellWidth / 6];
    [self.constraintArray[1] setConstant:cellWidth / 6];
    [self.constraintArray[0] setConstant:cellWidth / 3];
}

- (void)myAction {
    [self myLayout];
}

问题是,当 simulators 方向改变时,buttons 宽度没有改变到应有的大小。我必须再次调用 myAction 以便 buttons 进行应有的布局。我厌倦了从 viewDidLayoutSubviews:

调用 myLayout
- (void)viewDidLayoutSubviews {
    [super viewDidLayoutSubviews];

    [self myLayout];
}

但这没有用,我没有收到任何错误。

更新 1:

Constraint 宽度是这样开始的:

constraintArray[1] =  62.500000
constraintArray[2] =  62.500000
constraintArray[3] =  125.000000

旋转设备时:

constraintArray[1] =  62.500000
constraintArray[2] =  62.500000
constraintArray[3] =  80.500000

旋转后应该是什么:(或者我调用myAction后)

constraintArray[1] =  55.083333 
constraintArray[2] =  55.083333 
constraintArray[3] =  110.000000

更新二:

这是一个具有相同问题的类似项目的 link:Project

要让按钮在其父视图调整大小时调整大小,请不要设置它们的宽度限制。而是设置它们的前导和尾随约束,这将使它们的宽度变得灵活。

如果您需要以编程方式更改它们的宽度,请调整前导或尾随约束。

要使宽度按比例相等,请设置 "Equal Widths" 约束并设置其乘数(例如,乘数=2 表示一个是另一个的两倍)。

然后如果你需要隐藏一个按钮,给一个宽度约束以及等宽约束但是设置宽度约束优先级为1,设置等宽约束优先级为999。你可以hide/show通过交换这些约束的优先级以编程方式按钮

我刚刚查看了您的项目。我知道您以错误的方式实施了它。请参阅约束对保证金的影响。这里所有的按钮都没有得到适当的边距。

此外,您将等宽应用到 100 会导致问题。 您的第二个和第三个视图大小相同,但您的第四个视图大小不同。

要解决这个问题,您应该在第四个按钮之后再按一个按钮(第五个按钮)。 现在在一个视图中添加第二个和第三个视图,在一个视图中添加第四个和第五个视图。并为第一个按钮、第二个视图和第三个视图分配相同的宽度。现在再改变方向它不会引起问题。您应该更新第四个和第五个按钮,就像第二个和第三个一样。