在Container View约束集合上使用activateConstraints时出错

时间:2015-04-10 02:05:00

标签: ios xcode nslayoutconstraint size-classes uicontainerview

在我的iOS 8应用程序中使用大小类,为了让iPad在纵向和横向上具有不同的布局,我为每个激活和停用的方向都有一个IBOutletCollection。在引入容器视图之前,这已经很好了。

我正在添加一个新的VC,它是iPhone版本中的一个单独的标签项,但我使用容器视图将其嵌入到iPad布局中。我将专注于一个大小类,RegularRegular。容器视图有4个约束:尾随,前导,顶部和底部。当我运行应用程序时,它看起来很好(在单一方向)。

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

***由于未捕获的异常'NSGenericException'终止应用程序,原因:'无法激活带有项的约束; layer =; contentOffset:{0,0}; contentSize:{460,78}>和>因为他们没有共同的祖先。约束是否引用不同视图层次结构中的项目?这是非法的。'

约束不引用不同视图层次结构中的项目。 Top,Bottom和Leading都与VC视图中的另一个视图有关。尾随与VC的视图中的步进器有关。因此,根据我的知识,他们都处于相同的层级。

在调试中,我可以看到约束以其active属性nil开始。这似乎是正常的(非容器约束在它们被设置为YES之前开始相同)。我使用for循环设置了active属性来检查它。

我对容器视图的约束有什么问题吗?容器视图上的约束是否特殊,因为它们位于容器视图上?我自己试着找到答案,但我似乎无法找到关于这个问题的任何事情。

非常感谢任何帮助。

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

在下图中,容器的Leading,Top和Bottom约束与容器右侧的视图有关。尾随约束与其上方的步进相关。 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];

2 个答案:

答案 0 :(得分:1)

  

在调试时,我可以看到约束以其活动属性为零开始

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

  • 后者是UIView方法,因此您将有意识地控制添加约束的视图。

  • 删除时,如果您想稍后再次使用这些约束,您将清楚自己有责任保留已删除的约束。

我发现这不会直接回答您的问题,但您没有提供足够的信息(您没有显示调用activateConstraintsdeactivateConstraints的代码,您没有t显示视图控制器和视图层次结构等的任何图表。所以不完全清楚你哪里出错了。相反,当你试图解决问题的细节时,我试图让你重新调整你的思考

答案 1 :(得分:1)

问题是容器视图未安装'在施加约束时。我正在激活viewWillLayoutSubviews,所以当时大小等级尚未确定。

要解决此问题,我现在已为AnyAny安装了Container View。然后我取消选择了我不希望它存在的所有大小类。

我最终发现这是问题,因为我的容器视图UIView不在self.view.subviews