iOS: 同时更新约束和框架
iOS: updating constraints and frame at the same time
我的应用程序中有一个 UITextField
在左边,一个 UIButton
在右边。文本字段锚定在父视图(容器视图)的左侧和按钮的右侧。
所以在文本框的左边有一个
leading space = 0 in relation of container
右边a
trailing space = 0 in relation of button
但是如果我以正确的方式移动按钮,更改 x 原点值,为什么文本字段不扩大其宽度?
(很明显,按钮对宽度和高度以及位置有限制,但不会锁定文本字段)
所以如果我这样做
self.mybutton.frame = CGRectMake(self.mybutton.frame.origin.x+100, self.mybutton.frame.origin.y, self.mybutton.frame.size.width, self.mybutton.frame.size.height);
按钮向正确的方向移动,但文本字段似乎没有扩大其宽度。
你知道为什么吗?
同时使用自动布局和编程 positioning/sizing 会带来很多麻烦。部分原因是您在自动布局中创建了约束,基本上是 "rules" 您的应用在布局所有视图时必须遵循的约束,并且当您更改框架、边界或中心属性时,您可能会失效那些规则。但由于自动布局不会不断地重新计算视图的布局,因此在触发布局重新计算之前,问题可能不会被注意到。
所以要回答你的问题,更改按钮的框架不会更改文本,因为自动布局不知道有任何更改。另外,您还没有更改按钮上的约束,因此如果您确实在文本字段和按钮上调用了 - (void) setNeedsUpdateConstraints
,您正在寻找的更改将不会发生。该按钮将移回其初始位置,即您设置约束的位置。
你可能想要做的是在控制按钮如何定位在 x 轴上的任何东西上创建一个 IBOutlet
(即它的尾随 space...如果你就是这样的话正在使用)。然后而不是做:
self.mybutton.frame = CGRectMake(self.mybutton.frame.origin.x+100, self.mybutton.frame.origin.y, self.mybutton.frame.size.width, self.mybutton.frame.size.height);
你可以这样做:
self.mybuttonXconstraint.constant = self.mybuttonXconstraint.constant + 100
[self.parentView setNeedsUpdateConstraints]
第二行是为了确保自动布局知道约束已被更改,并且它应该重新计算涉及父约束的任何视图的布局。
您也可能对此感兴趣 - iOS Developer Library - Auto Layout Guide
您可以尝试为按钮的尾部约束设置动画吗?
像这样(出于说明目的,我更改了动画块内的约束):
UIView.animateWithDuration(
5.0,
animations: {
self.buttonTrailingMarginConstraint.constant = 0
self.view.layoutIfNeeded() // Necessary when changing constraints.
}
)
最终结果:
Git 克隆项目:https://github.com/backslash-f/animating-constraints
我的应用程序中有一个 UITextField
在左边,一个 UIButton
在右边。文本字段锚定在父视图(容器视图)的左侧和按钮的右侧。
所以在文本框的左边有一个
leading space = 0 in relation of container
右边a
trailing space = 0 in relation of button
但是如果我以正确的方式移动按钮,更改 x 原点值,为什么文本字段不扩大其宽度?
(很明显,按钮对宽度和高度以及位置有限制,但不会锁定文本字段)
所以如果我这样做
self.mybutton.frame = CGRectMake(self.mybutton.frame.origin.x+100, self.mybutton.frame.origin.y, self.mybutton.frame.size.width, self.mybutton.frame.size.height);
按钮向正确的方向移动,但文本字段似乎没有扩大其宽度。 你知道为什么吗?
同时使用自动布局和编程 positioning/sizing 会带来很多麻烦。部分原因是您在自动布局中创建了约束,基本上是 "rules" 您的应用在布局所有视图时必须遵循的约束,并且当您更改框架、边界或中心属性时,您可能会失效那些规则。但由于自动布局不会不断地重新计算视图的布局,因此在触发布局重新计算之前,问题可能不会被注意到。
所以要回答你的问题,更改按钮的框架不会更改文本,因为自动布局不知道有任何更改。另外,您还没有更改按钮上的约束,因此如果您确实在文本字段和按钮上调用了 - (void) setNeedsUpdateConstraints
,您正在寻找的更改将不会发生。该按钮将移回其初始位置,即您设置约束的位置。
你可能想要做的是在控制按钮如何定位在 x 轴上的任何东西上创建一个 IBOutlet
(即它的尾随 space...如果你就是这样的话正在使用)。然后而不是做:
self.mybutton.frame = CGRectMake(self.mybutton.frame.origin.x+100, self.mybutton.frame.origin.y, self.mybutton.frame.size.width, self.mybutton.frame.size.height);
你可以这样做:
self.mybuttonXconstraint.constant = self.mybuttonXconstraint.constant + 100
[self.parentView setNeedsUpdateConstraints]
第二行是为了确保自动布局知道约束已被更改,并且它应该重新计算涉及父约束的任何视图的布局。
您也可能对此感兴趣 - iOS Developer Library - Auto Layout Guide
您可以尝试为按钮的尾部约束设置动画吗?
像这样(出于说明目的,我更改了动画块内的约束):
UIView.animateWithDuration(
5.0,
animations: {
self.buttonTrailingMarginConstraint.constant = 0
self.view.layoutIfNeeded() // Necessary when changing constraints.
}
)
最终结果:
Git 克隆项目:https://github.com/backslash-f/animating-constraints