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

Ego*_*gor 12 iphone uitableview ios autolayout

我有一个UITableViewCell的自定义子类,并设置了一些约束.

问题是当我尝试更改一个视图的大小时:

CGRect frm = CGRectMake(0, 0, someValue, 30);
cell.indentView.frame = frm;
Run Code Online (Sandbox Code Playgroud)

依赖于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;
    }
}
Run Code Online (Sandbox Code Playgroud)

Rob*_*Rob 13

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

简而言之,如果要UIView在自动布局中移动,则不得尝试更改frame,而是自行调整约束.如果你创建了这个简化IBOutlet了约束自己,在这一点上,你可以调整参考constantNSLayoutConstraint.


更新:

Egor建议枚举约束并编辑与相关约束匹配的约束.这很有效,但就个人而言,我更喜欢为IBOutlet我想要编辑的特定约束而不是枚举它们并搜索有问题的约束.如果你有一个IBOutletindentViewWidthConstraint了宽度NSLayoutConstraintindentView,你可以那么只需:

self.indentViewWidthConstraint.constant = newIndentConstantValue;
Run Code Online (Sandbox Code Playgroud)