1、如果最近你很不幸将XCode升级至8.0之后,你会发现你以前运行好好的项目程序,突然就crash了。你感觉莫名其妙,如果你的项目中刚好使用了第三方布局库Masonry,打断点你会发现错误既然你是设置的一些约束出现了问题。因为约束出现crash的原因大致有两个:
(1).XCode8中程序内原来2个字的宽度是24,现在2个字需要27的宽度来显示了。与字体有关的控件因为这个原因可能就会出现问题,导致crash。
(2).XCode8之后,由Masonry布局引起crash的原因还有可能是你之前使用Masonry布局的时候不够严谨,导致在iOS10上面出现crash,因为可能在iOS9之前你布局不严谨还不会crash,到iOS10上面可就不行,
对于想适配iOS10以及Xcode8的,大家可以上网去查阅相关资料。
2、使用Masonry时出现couldn't find a common superview,根据错误提示我们大概知道了错在哪里,你所设置约束的这个控件和所依赖的控件没有共同的父视图。因为没有共同的视图作为参照,frame 就不能转换到一个相同的坐标系。这个问题经常会出现在,我们创建了要设置约束的视图,而没有将它添加到父控件中,又或者,要设置约束的这个视图和所依赖的视图没有共同的父视图,也就是你遇到的这种情况。
(1).解决方案:在masonry控制对象约束前把对象增加进入某控件
[self.view addSubview:label];
(2).添加完之后,你发现还是有问题,这个时候你就要看下你设置约束的视图和它所参照的视图,找来找去你还是没有找到原因,还有个原因可能是,
[self.view addSubview:self.InsertView];
[self.InsertView addSubview:_cashLabel];
[self.cashLabel mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.equalTo(self.InsertView.mas_left).equalTo(@10);
make.top.equalTo(self.InsertView.mas_top).equalTo(@14);
}];
你会发你使用了_下划线语法,刚好你有对label进行了懒加载,重载了其get方法。self.cashLabel会调用属性的getter方法,触发懒加载,但是_cashLabel只是访问一个局部变量。所以这样添加的控件总是出错的原因也就在这里了。
由于本人水平有限,如有写错的地方还望指出,本人也会第一时间修改错误,避免误导大家。
网友评论