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