addSubview 打破内部约束

Posted

技术标签:

【中文标题】addSubview 打破内部约束【英文标题】:addSubview breaking internal contraints 【发布时间】:2015-03-11 19:21:23 【问题描述】:

我在动态添加子视图时遇到了一些麻烦。也就是说,当我有一个在界面构建器中内置约束的视图然后使用[view addSubview:subview] 时,它会破坏我设置的所有约束。

我尝试添加[subview setAutoresizingMask:NO];subview.translatesAutoresizingMaskIntoConstraints = false;

我预计子视图对其原始父级的约束会被破坏,并在我调用addSubview 后以编程方式将它们添加回来,但我没想到它的子视图的约束也会被破坏。

不幸的是,重新添加子约束是不可行的。我们使用的架构是插件模型,虽然从主 UIViewController 调整插件容器的大小很简单,但插件需要负责定位其内部元素。

以下是事物外观的模型:

这是它目前的样子:

我怎样才能获得addSubview 来维护这些内部约束?红色、绿色和蓝色框仅相互约束以及它们的父级(紫色),它们都通过addSubview 实现。

【问题讨论】:

当您将 View1 添加为子视图时,您如何定义其大小和位置?你在使用约束吗?如果是这样,您要添加哪些约束? 它的宽度、前导和顶部与它的新父级绑定(宽度相等,其他为 0)。高度是静​​态的。 不应丢失内部约束(我尝试时不会丢失)。您应该将 translatesAutoresizingMaskIntoConstraints 设置为 false,这样就可以了。我认为你必须更明确地说明你有什么约束,所以显示你如何加载和添加这个视图的整个代码,以及你添加的约束。 【参考方案1】:

我尝试了太多方法,包括 sizeToFit() 和设置 translatesAutoresizingMaskIntoConstraints 但它不起作用。您应该设置要添加为子视图的自定义视图的宽度,并且应该设置视图的 sizeToFit()。它对我有用:

bigView.sizeToFit()
subView.sizeToFit()
subView.width = screenWidth
bigView.addSubview(subView)

【讨论】:

以上是关于addSubview 打破内部约束的主要内容,如果未能解决你的问题,请参考以下文章

自动布局约束警告“将尝试通过打破约束来恢复”

ScrollView 滚动出约束

以编程方式更改 UILabel 上的约束打破布局

ScrollView 自动布局约束打破设备旋转

NSLayoutConstrain - 将尝试通过打破约束来恢复 - 以编程方式创建约束 [重复]

CollectionView 约束打破