iOS:同时更新约束和框架

时间:2016-05-13 00:23:30

标签: ios constraints nslayoutconstraint

我的应用中左侧有一个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);

按钮向右移动但文本字段似乎没有扩大其宽度。 你知道为什么吗?

2 个答案:

答案 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.
    }
)

最终结果:

Example

Git克隆项目:https://github.com/backslash-f/animating-constraints