1、如果最近你很不幸將XCode升級至8.0之后,你會發(fā)現(xiàn)你以前運行好好的項目程序,突然就crash了。你感覺莫名其妙,如果你的項目中剛好使用了第三方布局庫Masonry,打斷點你會發(fā)現(xiàn)錯誤既然你是設(shè)置的一些約束出現(xiàn)了問題。因為約束出現(xiàn)crash的原因大致有兩個:
(1).XCode8中程序內(nèi)原來2個字的寬度是24,現(xiàn)在2個字需要27的寬度來顯示了。與字體有關(guān)的控件因為這個原因可能就會出現(xiàn)問題,導(dǎo)致crash。
(2).XCode8之后,由Masonry布局引起crash的原因還有可能是你之前使用Masonry布局的時候不夠嚴(yán)謹(jǐn),導(dǎo)致在iOS10上面出現(xiàn)crash,因為可能在iOS9之前你布局不嚴(yán)謹(jǐn)還不會crash,到iOS10上面可就不行,
對于想適配iOS10以及Xcode8的,大家可以上網(wǎng)去查閱相關(guān)資料。
2、使用Masonry時出現(xiàn)couldn't find a common superview,根據(jù)錯誤提示我們大概知道了錯在哪里,你所設(shè)置約束的這個控件和所依賴的控件沒有共同的父視圖。因為沒有共同的視圖作為參照,frame 就不能轉(zhuǎn)換到一個相同的坐標(biāo)系。這個問題經(jīng)常會出現(xiàn)在,我們創(chuàng)建了要設(shè)置約束的視圖,而沒有將它添加到父控件中,又或者,要設(shè)置約束的這個視圖和所依賴的視圖沒有共同的父視圖,也就是你遇到的這種情況。
(1).解決方案:在masonry控制對象約束前把對象增加進(jìn)入某控件
[self.view addSubview:label];
(2).添加完之后,你發(fā)現(xiàn)還是有問題,這個時候你就要看下你設(shè)置約束的視圖和它所參照的視圖,找來找去你還是沒有找到原因,還有個原因可能是,
[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);
}];
你會發(fā)你使用了_下劃線語法,剛好你有對label進(jìn)行了懶加載,重載了其get方法。self.cashLabel會調(diào)用屬性的getter方法,觸發(fā)懶加載,但是_cashLabel只是訪問一個局部變量。所以這樣添加的控件總是出錯的原因也就在這里了。
由于本人水平有限,如有寫錯的地方還望指出,本人也會第一時間修改錯誤,避免誤導(dǎo)大家。