我的应用中左侧有一个UITextField
,右侧有一个UIButton
。文本字段锚定在superview(容器视图)的左侧和按钮的右侧。
所以在textfield的左边有一个
与容器相关的前导空格= 0
在右边一个
关于按钮的尾随空格= 0
但如果我在正确的方向上移动按钮,更改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);
按钮向右移动但文本字段似乎没有扩大其宽度。 你知道为什么吗?
答案 0 :(得分:2)
使用自动布局和编程定位/大小调整可能会产生很多麻烦。部分原因是因为您在自动布局中创建了约束,这些约束基本上是应用程序在布置所有视图时必须遵循的“规则”,当您更改框架,边界或中心属性时,您可能会使这些规则无效。但由于自动布局不会不断地重新计算视图的布局,因此在触发布局重新计算之前可能会忽略问题。
因此,要回答您的问题,更改按钮的框架不会更改文本,因为自动布局不知道任何内容已更改。另外,您没有更改按钮上的约束,因此如果您在文本字段和按钮上调用- (void) setNeedsUpdateConstraints
,则不会发生您要查找的更改。该按钮将移回其初始位置,即您使用约束设置的位置。
您可能想要做的是创建一个IBOutlet
来控制按钮在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);
您可以执行以下操作:
self.mybuttonXconstraint.constant = self.mybuttonXconstraint.constant + 100
[self.parentView setNeedsUpdateConstraints]
第二行是确保自动布局知道约束已被更改,并且应该重新计算与父约束相关的任何视图的布局。
您也可能对此感兴趣 - iOS Developer Library - Auto Layout Guide
答案 1 :(得分:0)
你能试试动画按钮的尾随约束吗?
像这样(为了说明目的,我更改了动画块内的约束):
UIView.animateWithDuration(
5.0,
animations: {
self.buttonTrailingMarginConstraint.constant = 0
self.view.layoutIfNeeded() // Necessary when changing constraints.
}
)
最终结果:
Git克隆项目:https://github.com/backslash-f/animating-constraints