因未捕获的异常 'NSGenericException' 而终止应用程序,原因是:无法在视图上安装约束条件。 约束条件是否引用视图子树之外的内容? 这是不合法的。 约束条件为: 视图:;层 = ;contentOffset: {0, 0}>'
因未捕获的异常 'NSGenericException' 而终止应用程序,原因是:无法在视图上安装约束条件。 约束条件是否引用视图子树之外的内容? 这是不合法的。 约束条件为: 视图:;层 = ;contentOffset: {0, 0}>'
您需要将限制条件安装在两个视图中“更高的”一个上。一种好的一般方法是这样的:
NSLayoutConstraint* constraint = ...;
NSView* firstView = constraint.firstItem;
NSView* secondView = constraint.secondItem;
[[firstView ancestorSharedWithView: secondView] addConstraint: constraint];
仅提醒一下:要记住约束属性是在添加它们的视图上下文中进行评估的。因此,例如,对于安装在viewB上的约束的viewA的NSLayoutAttributeLeft的值在viewB的坐标空间中解释。对于仅参考兄弟视图或其父视图的约束,这个事实基本上不相关,但并没有限制约束不能引用不是兄弟或直接父级的两个视图。
ancestorSharedWithView
方法只在 Mac 上定义了,而没有在 iOS 上定义吗?我看到它是在 AppKit.framework 库中定义的,而这个库只属于 Mac OSX10.8。 - abbood[secondView isDescendantOfView: x]
。但概念是相同的 - 您始终希望在所有涉及视图的共同祖先上安装约束,并且该约束将在安装它的视图的坐标空间中解决。 - ipmcc和neoneye一样,我因为移除带有约束条件的子视图而出现了这个问题。但是,我有一个将父视图定位的约束条件,如果我调用[self.view removeConstraints:self.view.constraints];
就会将其删除。相反,我进行了以下更改:
原始代码:
for (UIView *subview in [view subviews]) {
[subview removeFromSuperview];
}
已修复以消除子视图上的约束限制:
NSMutableArray * constraints_to_remove = [ @[] mutableCopy] ;
for( NSLayoutConstraint * constraint in view.constraints) {
if( [view.subviews containsObject:constraint.firstItem] ||
[view.subviews containsObject:constraint.secondItem] ) {
[constraints_to_remove addObject:constraint];
}
}
[view removeConstraints:constraints_to_remove];
for (UIView *subview in [view subviews]) {
[subview removeFromSuperview];
}
更新:所以我再次遇到了这个错误 - 这次是由于移除一个视图导致的。添加了一个函数来清理地删除该视图:
void cleanRemoveFromSuperview( UIView * view ) {
if(!view || !view.superview) return;
//First remove any constraints on the superview
NSMutableArray * constraints_to_remove = [NSMutableArray new];
UIView * superview = view.superview;
for( NSLayoutConstraint * constraint in superview.constraints) {
if( constraint.firstItem == view ||constraint.secondItem == view ) {
[constraints_to_remove addObject:constraint];
}
}
[superview removeConstraints:constraints_to_remove];
//Then remove the view itself.
[view removeFromSuperview];
}
// I had forgotten to remove constraints first. This caused the crash.
[self.view removeConstraints:self.view.constraints];
NSArray *subviews = self.view.subviews;
for (UIView *subview in subviews) {
[subview removeFromSuperview];
}
[self addYourSubviewsHere];
我遇到了一个问题,使用UIPickerView作为UITextField的输入(使用Autolayout)。当我推出另一个视图控制器并返回到带有picker的视图控制器时,应用程序会崩溃。我在UIPickerViewController中找到了以下解决方案:
-(void)viewWillAppear:(BOOL)animated{
[self.pickerView removeFromSuperview];
[self.pickerView setTranslateAutoresizingMaskIntoContraints:YES];
[self.view addSubview];
}
在从父视图中移除后,您还可以设置UIPickerViewPosition。希望这能帮到您!
UIDatePicker
作为TextField
的inputAccessoryView
。我推出了一个视图控制器,然后返回,它就会抛出异常。我尝试了你的代码,但对我不起作用。请注意,我在故事板中有UIDatePicker
(而非通过代码创建)。 - Geek我发现添加这一行代码可以解决Cocoa ScrollView的问题。
[scrollView setTranslatesAutoresizingMaskIntoConstraints:NO];
我认为某些视图在运行时添加了约束,因此当您通过Objective-C添加自己的约束时会发生冲突,因此您需要禁用此行为...
我曾经遇到过同样的崩溃问题,后来发现这是由于约束乘数的浮点精度问题所致。 我将所有的约束乘数转换成较好的浮点值(例如0.375而不是0.35),并解决了这个崩溃问题。
AutoLayout: removeFromSuperview / removeConstraints throws exception and crashes hard
同样的错误,在这里有不同的解决方案:
在添加新视图并忘记在界面构建器中关闭使用自动布局
后,我在iOS 6启动我的应用程序时遇到了这个错误...我讨厌它没有标准设置来默认不使用自动布局来创建新视图...