视图宽度无法通过自动布局正确更改
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 会导致问题。
您的第二个和第三个视图大小相同,但您的第四个视图大小不同。
要解决这个问题,您应该在第四个按钮之后再按一个按钮(第五个按钮)。
现在在一个视图中添加第二个和第三个视图,在一个视图中添加第四个和第五个视图。并为第一个按钮、第二个视图和第三个视图分配相同的宽度。现在再改变方向它不会引起问题。您应该更新第四个和第五个按钮,就像第二个和第三个一样。
我在 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 会导致问题。 您的第二个和第三个视图大小相同,但您的第四个视图大小不同。
要解决这个问题,您应该在第四个按钮之后再按一个按钮(第五个按钮)。 现在在一个视图中添加第二个和第三个视图,在一个视图中添加第四个和第五个视图。并为第一个按钮、第二个视图和第三个视图分配相同的宽度。现在再改变方向它不会引起问题。您应该更新第四个和第五个按钮,就像第二个和第三个一样。