在以编程方式更改视图维度时,Autolayout似乎无法正常工作

时间:2013-01-08 13:07:01

标签: iphone ios uitableview 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;
    }
}

2 个答案:

答案 0 :(得分:13)

这是因为你不能只改变具有自动布局约束的对象的框架(因为约束决定了位置,而不是手动设置frame属性...... frame属性将被重置为约束重新应用)。请参阅this松散相关的帖子,其中演示了如何正确调整约束以移动视图。 (在这种情况下,我们是动画,这不是问题,但它确实演示了如何调整约束以实现UIView的移动。)

简而言之,如果您想在自动布局中移动UIView,则不得尝试更改frame,而是自行调整约束。如果您为约束本身创建IBOutlet引用,则会进行简化,此时,您可以调整constant的{​​{1}}。


<强>更新

Egor建议枚举约束并编辑与所讨论的约束相匹配的约束。这很有效,但就个人而言,我更喜欢为我想要编辑的特定约束设置NSLayoutConstraint,而不是枚举它们并搜索有问题的约束。如果您IBOutlet的宽度为IBOutlet indentViewWidthConstraint NSLayoutConstraint,则可以简单地:

indentView

答案 1 :(得分:2)

你必须告诉框架更新,例如致电setNeedsLayoutsetNeedsUpdateConstraintslayoutIfNeeded。 有关正确用法的信息,请参阅UIView的文档。