? 最近項(xiàng)目中,使用XCode7.2.1版本進(jìn)行開(kāi)發(fā)耻卡,界面采用xib+AutoLayout技術(shù)牲尺,其中有個(gè)動(dòng)畫(huà)是設(shè)置NSLayoutConstraint的active屬性來(lái)進(jìn)行。
historyConstraint.active=NO;//active只能在iOS8.0以上使用
holdConstraint.active=YES;
在現(xiàn)有XCode7.2.1中使用iOS8.1以上的模擬器測(cè)試均沒(méi)有問(wèn)題溃卡,項(xiàng)目適配iOS7.0以上的版本蜒简,公司測(cè)試設(shè)備機(jī)型是iPhone4s 9.3.1的系統(tǒng),不能進(jìn)行真機(jī)測(cè)試犹赖,只能使用模擬器了。
我的iMac是10.10的系統(tǒng)麸折,參考了XCode7使用iOS7模擬器垢啼,正好這個(gè)系統(tǒng)還能夠按照上面的教程進(jìn)行iOS7模擬器使用张肾,測(cè)試點(diǎn)擊按鈕時(shí),app直接崩潰了馁启。我的本意是使用XCode6.3進(jìn)行編譯尸饺,這樣就能直接調(diào)試了∶椋可代碼是在XCode7上coding,用了很多XCode7的特性迹栓,需要改很多東西。所以還是用XCode7編譯克伊,通過(guò)try-catch-finally,在模擬器的system Log上面獲取到NSException,打印
NSLog(@"訂單異常酥郭,exception = %@, historyConstraint = %@, holdConstraint = %@, [exceptiondescription],historyConstraint,holdConstraint);
發(fā)現(xiàn)均顯示為nil愿吹,這就奇怪了不从,兩個(gè)NSLayoutConstraint對(duì)象都是從storyBoard中直接獲取,怎么會(huì)沒(méi)有犁跪,于是在viewDidLoad中打印這兩個(gè)對(duì)象,發(fā)現(xiàn)historyConstraint為nil,holdConstraint是有值的坷衍。為何如此寝优,翻閱NSLayoutConstraint對(duì)象文件,發(fā)現(xiàn)active是在iOS8.0以上才有的枫耳,對(duì)于8.0以下是沒(méi)有該屬性乏矾,所以需要系統(tǒng)判斷,另外historyConstraint對(duì)象在xib中是這樣的
installed為NO,這個(gè)對(duì)應(yīng)就是NSLayoutConstraint的active屬性钻心,所以在iOS7.0中是沒(méi)有該對(duì)象的凄硼,而在iOS8.0以上卻可以通過(guò).active=YES進(jìn)行添加約束,這也是iOS8.0的一些改進(jìn)帆喇。言歸正傳,對(duì)于這個(gè)約束亿胸,我采取不通過(guò)xib進(jìn)行設(shè)置侈玄,直接用代碼編寫(xiě)的方法
iOS7HistoryConstraint= [NSLayoutConstraintconstraintWithItem:historyButtonattribute:NSLayoutAttributeLeadingrelatedBy:NSLayoutRelationEqualtoItem:headBottonViewattribute:NSLayoutAttributeLeadingmultiplier:1.0constant:-15.0];
然后通過(guò)
if([defaultAppSet systemVersion] >=8.0) {
? historyConstraint.active=NO;//active只能在iOS8.0以上使用
? holdConstraint.active=YES;
}
else{
? [headView removeConstraint:iOS7HistoryConstraint];
? [headView addConstraint:holdConstraint];
}
再次在iOS7.1模擬器上進(jìn)行測(cè)試吟温,能點(diǎn)擊潘悼,沒(méi)有崩潰了。你以為這樣就完了治唤。宾添。
? No,我發(fā)現(xiàn)在從historyConstraint切換成holdConstraint,動(dòng)畫(huà)停止了柜裸,沒(méi)有動(dòng)靜缕陕,通過(guò)try-catch-finally發(fā)現(xiàn)holdConstraint又變成nil,看來(lái)是
__weak IBOutlet NSLayoutConstraint*holdConstraint;//!!!iOS8.0以下不能使用active屬性,需要強(qiáng)引用
再次將__weak去掉疙挺,或者改成__strong,重新編譯扛邑,放在iOS7.1模擬器上面測(cè)試,No Problem铐然,萬(wàn)事大吉蔬崩。
? 另外發(fā)現(xiàn)UITableView在iOS7.1下只設(shè)置了
//tbView.estimatedSectionHeaderHeight = 0.002f;//90 / kHeight * [defaultAppSet screenHeight];
//tbView.estimatedSectionFooterHeight = 70 / kHeight * [defaultAppSet screenHeight];
結(jié)果直接崩潰。后臺(tái)查閱資料細(xì)說(shuō)UITableView
默認(rèn)狀態(tài)下 的估計(jì)高度
@property (nonatomic) CGFloat estimatedSectionHeaderHeight
@property (nonatomic) CGFloat estimatedSectionFooterHeight
@property (nonatomic) CGFloat estimatedRowHeight
這個(gè)是估計(jì)高度锦爵,可用于cell的動(dòng)態(tài)高度設(shè)置舱殿,必須要設(shè)置
tbView.sectionHeaderHeight=0.001f;
tbView.sectionFooterHeight=70/kHeight* [defaultAppSet screenHeight];
? ?不過(guò)在iOS8.0以上我沒(méi)有設(shè)置sectionHeaderHeight和sectionFooterHeight也沒(méi)有崩潰,奇怪险掀。這就是這一次的碰到的NSLayoutConstraint active屬性bug沪袭。請(qǐng)指教!