12

我有 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;
    }
}
4

2 回答 2

13

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

简而言之,如果你想UIView在自动布局内移动一个,你一定不能尝试改变frame,而要自己调整约束。如果您为约束本身创建参考,这将被简化,IBOutlet此时您可以调整constant.NSLayoutConstraint


更新:

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

self.indentViewWidthConstraint.constant = newIndentConstantValue;
于 2013-01-08T13:28:35.790 回答
2

您必须告诉框架进行更新,例如通过调用setNeedsLayout,setNeedsUpdateConstraintslayoutIfNeeded. 有关正确用法,请参阅UIView的文档。

于 2013-01-08T13:25:55.853 回答