以编程方式更改视图尺寸时,Autolayout似乎不起作用

我有一个UITableViewCell的自定义子类与一些约束设置。

问题是当我尝试改变一个视图的大小,像这样:

CGRect frm = CGRectMake(0, 0, someValue, 30); cell.indentView.frame = frm; 

其他依赖于cell.indentView宽度的视图根本不移动。

可能是什么情况?

此代码将工作:

 // enumerate over all constraints for (NSLayoutConstraint *constraint in cell.indentView.constraints) { // find constraint on this view and with 'width' attribute if (constraint.firstItem == cell.indentView && constraint.firstAttribute == NSLayoutAttributeWidth) { // increase width of constraint constraint.constant = someValue; break; } } 

这是因为你不能只改变具有自动布局约束的对象的框架(因为约束规定了位置,而不是手动设置frame属性…当重新应用约束时frame属性将被重置)。 看到这个松散相关的post,其中演示了如何正确调整约束来移动视图。 (在这种情况下,我们正在进行animation制作,这不是问题,但它确实展示了如何调整约束来影响UIView的移动。)

总之,如果你想在自动布局中移动一个UIView ,你不能尝试改变frame ,而是自己调整约束。 如果您为约束本身创buildIBOutlet引用,那么这可以被简化,在这一点上,您可以调整NSLayoutConstraintconstant


更新:

叶戈尔build议列举约束条件并编辑与所讨论的相匹配的约束条件。 这很好,但是个人而言,我更喜欢有一个IBOutlet来处理我想要编辑的特定约束,而不是列举它们并search那个问题。 如果您有一个名为indentViewWidthConstraint的宽度为NSLayoutConstraintindentView ,那么您可以简单地:

 self.indentViewWidthConstraint.constant = newIndentConstantValue; 

你必须通过调用setNeedsLayoutsetNeedsUpdateConstraintslayoutIfNeeded来告诉框架进行更新。 有关正确的用法,请参阅UIView的文档。