ios - 对容器 View 约束集合使用 activateConstraints 时出错

标签 ios xcode nslayoutconstraint size-classes uicontainerview

在我使用尺寸类别的 iOS 8 应用程序中,为了让 iPad 在纵向和横向上具有不同的布局,我为激活和停用的每个方向都有一个 IBOutletCollection。在引入容器 View 之前,这一直很有效。

我添加了一个新的 VC,它是 iPhone 版本中的一个单独的选项卡项目,但我使用容器 View 将其嵌入到 iPad 布局中。我将只关注一种尺寸类别,RegularRegular。容器 View 有 4 个约束:Trailing、Leading、Top 和 Bottom。当我运行该应用程序时,它看起来很好(在单一方向)。

现在,当我将这 4 个约束添加到我的 IBOutletCollection 时,activateConstraints 消息失败并显示以下错误消息:

*** 由于未捕获的异常“NSGenericException”而终止应用程序,原因:“无法激活项目约束;层=;内容偏移: {0, 0}; contentSize: {460, 78}> 和 > 因为它们没有共同的祖先。约束是否引用不同 View 层次结构中的项目?这是非法的。”

约束不引用不同 View 层次结构中的项目。顶部、底部和领先都与 VC View 中的另一个 View 相关。 Trailing 与 VC 认为的步进器有关。所以据我所知,他们都处于相同的层次结构级别。

在调试时,我可以看到约束开始时其 active 属性为 nil。这似乎是正常的(非容器约束在设置为 YES 之前是相同的)。我通过设置 active 属性的 for 循环检查了这一点。

我对容器 View 的约束有什么问题吗?容器 View 上的约束是否有些特殊,因为它们位于容器 View 上?我尝试自己寻找答案,但似乎找不到与我遇到的这个问题有关的任何内容。

任何帮助将不胜感激。

4/10 编辑以提供图片和代码。请注意,此时我已将容器约束分解为一个单独的数组,以便我可以自行处理它们。

在下图中,容器的前导、顶部和底部约束与容器右侧的 View 相关。尾随约束与其上方的步进器相关。 VC Layout

相关代码:

@property (strong, nonatomic) IBOutletCollection(NSLayoutConstraint) NSArray *regularAnyConstraints;
@property (strong, nonatomic) IBOutletCollection(NSLayoutConstraint) NSArray *regularAnyContainerConstraints;

@property (strong, nonatomic) IBOutletCollection(NSLayoutConstraint) NSArray *anyRegularConstraints;
@property (strong, nonatomic) IBOutletCollection(NSLayoutConstraint) NSArray *anyRegularContainerConstraints;

这些是 _anyRegularContainerConstraints 数组中的约束: _anyRegularContainerConstraints

[NSLayoutConstraint deactivateConstraints:_regularAnyConstraints];
[NSLayoutConstraint activateConstraints:_anyRegularConstraints];

[NSLayoutConstraint deactivateConstraints:_anyRegularContainerConstraints];
[NSLayoutConstraint activateConstraints:_anyRegularContainerConstraints];

最佳答案

When in debug, I can see that the constraint starts off with its active property as nil

这句话让我想知道您是否可能误解了 activateConstraintsdeactivateConstraints 的作用。尽管它们的名字如此,尽管文档中的条目具有误导性,但它们实际上添加和删除了约束。因此,我建议您最好直接调用 addConstraintsremoveConstraints,而不是让自己对这些命令感到困惑。这样做的好处是:

  • 后者是 UIView 方法,因此您将有意识地控制将约束添加到哪个 View 。

  • 删除时,您将清楚自己有责任保留已删除的约束(如果您以后想再次使用它们)。

我意识到这并不能直接回答您的问题,但您没有提供足够的信息(您没有显示调用 activateConstraintsdeactivateConstraints 的代码code>,您没有显示任何 View Controller 和 View 层次结构的图表等),因此并不完全清楚您出错的地方。相反,我试图让您在尝试解决问题的细节时重新调整您的思维

关于ios - 对容器 View 约束集合使用 activateConstraints 时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29552152/

相关文章:

iOS 开发 - 圆形矩形按钮向下移动子菜单

objective-c - 如何在 iOS 中标记和取消标记行

swift - 如何以编程方式更新 UIView 的恒定高度约束?

ios - 我可以更改 NSLayoutConstraint 的乘数属性吗?

ios - 以编程方式设置时无法满足 NSLayoutConstraints

ios - UIStackView 重置其中按钮的属性

iOS - 并发执行 5 个操作,使用 NSOperationQueue 将图像上传到服务器,然后在 Objective-c 中执行单个任务

ios - AudioUnitSetProperty Swift 错误

ios - 如何在 Swift 中从 PLIST 读取数据?

xcode - 无法让自定义类在 SpriteKit 场景中工作(swiftui 和 xcode beta)