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了约束自己,在这一点上,你可以调整参考constant的NSLayoutConstraint.
更新:
Egor建议枚举约束并编辑与相关约束匹配的约束.这很有效,但就个人而言,我更喜欢为IBOutlet我想要编辑的特定约束而不是枚举它们并搜索有问题的约束.如果你有一个IBOutlet叫indentViewWidthConstraint了宽度NSLayoutConstraint的indentView,你可以那么只需:
self.indentViewWidthConstraint.constant = newIndentConstantValue;
Run Code Online (Sandbox Code Playgroud)