以编程方式更改视图尺寸时,自动布局似乎不起作用
Posted
技术标签:
【中文标题】以编程方式更改视图尺寸时,自动布局似乎不起作用【英文标题】:Autolayout seems not working when changing view dimensions programmatically 【发布时间】:2013-01-08 13:07:00 【问题描述】:我有一个 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;
【问题讨论】:
AutoLayout 太丑了,让我哭了。编码快乐! +1 到上面的自动布局仇恨者。那是最糟糕的地狱。在一个项目中使用它之前,你需要思考一百次。我最好在某些屏幕上添加几行计算帧的代码。 @Rob 最糟糕的是,即使您将部署目标设置为 >= ios 5,它也感觉像是在自动开启! 【参考方案1】:这是因为您不能只更改具有自动布局约束的对象的框架(因为约束决定了位置,而不是手动设置 frame
属性...frame
属性将在重新应用约束时重置)。请参阅this 松散相关的帖子,其中演示了如何正确调整约束以移动视图。 (在这种情况下,我们正在制作动画,这不是这里的问题,但它确实演示了如何调整约束以影响 UIView
的移动。)
简而言之,如果你想在自动布局中移动一个UIView
,你不能试图改变frame
,而是自己调整约束。如果您为约束本身创建IBOutlet
引用,这将被简化,此时您可以调整NSLayoutConstraint
的constant
。
更新:
Egor 建议枚举约束并编辑与所讨论的约束匹配的约束。这很好用,但就我个人而言,我更喜欢为我想要编辑的特定约束使用IBOutlet
,而不是枚举它们并寻找有问题的约束。如果你有一个 IBOutlet
名为 indentViewWidthConstraint
的宽度为 NSLayoutConstraint
的 indentView
,那么你可以简单地:
self.indentViewWidthConstraint.constant = newIndentConstantValue;
【讨论】:
【参考方案2】:您必须告诉框架进行更新,例如通过调用setNeedsLayout
、setNeedsUpdateConstraints
或layoutIfNeeded
。
有关正确用法,请参阅UIView 的文档。
【讨论】:
这对我来说还不够 - 必须根据问题和其他答案更改约束。以上是关于以编程方式更改视图尺寸时,自动布局似乎不起作用的主要内容,如果未能解决你的问题,请参考以下文章