2014-12-05 31 views
0

我在我的一个项目中使用了自动布局,并且遇到了我认为应该是一件小事的麻烦。Autolayout哑(矿)?

举个例子,我有两个文字框在对方下面。我在两点之间创建了一个垂直间距约束。

我期望如果我移动顶部文本框(使用setFrame),约束意味着底部会自动移动它来强制约束?

我的想法是否正确?还是我用自动布局的方式来实现它的意图呢?即。我误解了它的目的。或者我应该使用除setFrame以外的其他方式移动顶部文本框?

任何输入都会很好。在此先感谢:-)

PS。我玩过使用:setTranslatesAutoresizingMaskIntoConstraints这似乎工作。但是,这似乎并不是这样做的正确方法。我最初的想法是,自动布局应该用少量代码来处理大小/位置关系,在这种情况下,我期望它将用零代码处理。

+0

我种的是iOS福利局的,但我不认为自动布局方面关系,这* *的变化随着时间的推移。我认为这是一次性的事情(初始布局)。所以是的,它听起来好像你在攻击它。可能是错的,虽然... – 2014-12-06 00:37:00

+0

@BrendanHannemann是的,它确实尊重随时间变化的关系。任何时候你打电话给'setNeedsLayout',它都会重新计算职位的位置。 – fishinear 2014-12-06 01:20:12

+1

但是,混合用户指定的布局(setFrame :)和自动布局是灾难的秘诀。既可以使用用户指定的布局(覆盖layoutSubviews并计算两个框的位置),也可以为两者使用用户自动布局,也可以使用顶部文本框。 – fishinear 2014-12-06 01:22:23

回答

1

你不能使用setFrame来做到这一点。自动布局决定框架。如果在事实发生后更改它,约束不会自动更新。

您可以获得对决定顶部框的Y位置(无论是以编程方式创建它还是使用IBOutlet)并更改其值的约束的引用。这将触发更新以重新计算所有内容的位置并再次运行布局。

你可以通过改变NSLayoutConstraint对象上的常量属性的值来做到这一点。

Reference Docs Here

+0

我使用和操作约束的问题是我想让第一个控件下面的控件相对于第一个文本框的高度移动。文本框只是一个例子,我真的有一个集合视图控件,下面有控件。随着collectionview的内容发生变化,其高度也会变化,因此所有项目都可以随时查看。我希望集合视图下方的控件相对于集合视图的高度向下移动。不知道我是否可以通过引用约束来做到这一点 - 因为我不确定分配给约束的值是多少? – 2014-12-06 23:39:37

+0

如果要以编程方式控制集合视图的高度,只需在控件上设置高度约束,并将该约束的常量属性更改为您计算的值。但是,这听起来像是您正在尝试将页脚放到集合视图上。这是一个不同的场景,因为你真的想把东西放在最后一个单元下面,而不是放在视图下面。真的吗? – 2014-12-07 00:13:31

+0

不,不是页脚。只需要在集合下面出现一些其他控件即可。你的意见给了我一个线索,虽然,建议,我会尝试创建集合的高度约束,并在运行时更改它。我猜自动布局将被更有效地用于这种方式,而不是使用上面提到的'setTranslates ....'方法。 – 2014-12-07 16:28:13