以编程方式更改视图尺寸时,自动布局似乎不起作用

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 引用,这将被简化,此时您可以调整NSLayoutConstraintconstant


更新:

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

self.indentViewWidthConstraint.constant = newIndentConstantValue;

【讨论】:

【参考方案2】:

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

【讨论】:

这对我来说还不够 - 必须根据问题和其他答案更改约束。

以上是关于以编程方式更改视图尺寸时,自动布局似乎不起作用的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式使用自动布局将子视图添加到 UICollectionView 不起作用

以编程方式自动布局不起作用

使用 UILabel 以编程方式自动布局不起作用

以编程方式自动布局不起作用

UIView addSubview 自动布局不起作用

CGRectOffset 后自动布局不起作用