當(dāng)新建一個(gè)xib文件view嘀倒,通過(guò)代碼加載進(jìn)來(lái),addSubView進(jìn)一個(gè)之前創(chuàng)建好的xib中時(shí),會(huì)發(fā)現(xiàn)這個(gè)view沒(méi)有出現(xiàn)
什么情況下會(huì)出現(xiàn)這種問(wèn)題呢鸽疾?
新建一個(gè)User Interface文件吊洼,選擇了系統(tǒng)提供的View時(shí),系統(tǒng)幫你創(chuàng)建好一個(gè)view制肮,加載這個(gè)view的時(shí)候會(huì)出現(xiàn)這種問(wèn)題冒窍,如果把系統(tǒng)提供好的view刪掉,重新拖進(jìn)一個(gè)來(lái)就不會(huì)出現(xiàn)這種問(wèn)題了
原因是:系統(tǒng)幫改了豺鼻,父控件發(fā)生變化综液,子控件發(fā)生同等變化
它們到底是怎么變化的?
一開始cellForRow方法中從緩存池中取cell儒飒,如果沒(méi)有就從xib中加載谬莹,加載進(jìn)來(lái)的cell寬*高 比如是:320 * 398,cell的contentView大約也是和cell同樣大小桩了,當(dāng)把一個(gè)從xib創(chuàng)建進(jìn)來(lái)的view244 * 120 add進(jìn)cell的contentView中后附帽,返回cell,cell要放在屏幕對(duì)應(yīng)的位置上井誉,cell會(huì)隨著設(shè)備屏幕寬高發(fā)生變化蕉扮,比如寬變?yōu)?75,高度變?yōu)樽约核愫玫母叨?70颗圣,寬度從320增加55到375慢显,高度從398減少228到170爪模,子控件view寬度244同樣增加55為299,高度一減沒(méi)了荚藻,就不能顯示了
cell一開始的尺寸跟最終顯示的尺寸是不一樣的屋灌,最終顯示出來(lái)是有發(fā)生變化的,cell發(fā)生變化应狱,它的contentView也發(fā)生變化共郭,里面的子控件也要對(duì)應(yīng)變化
分析:
UIView *childView = [[NSBundle mainBundle] loadNibNamed:@"view" owner:nil options:nil].firstObject;
[view addSubView:childView]
childView.autoresizingMask =?
默認(rèn)從xib加載進(jìn)來(lái)的控件有個(gè)屬性自動(dòng)伸縮屬性autoresizingMask不是0,即UIViewAutoresizingNone疾呻,而是UIViewAutoresizingFlexibleHeight |?UIViewAutoresizingFlexibleWidth除嘹,這個(gè)屬性可用于控制當(dāng)前的控件的寬度和高度用不用根據(jù)父控件的伸縮而伸縮
如果它的屬性值是UIViewAutoresizingFlexibleWidth,就代表寬度會(huì)根據(jù)父控件的伸縮而伸縮
如果它的屬性值是UIViewAutoresizingFlexibleHeight岸蜗,就代表高度會(huì)根據(jù)父控件的伸縮而伸縮
如果它的屬性值是UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth尉咕,就代表寬度和高度會(huì)根據(jù)父控件的伸縮而伸縮
如果它的屬性值是UIViewAutoresizingNone,就代表寬度和高度不會(huì)根據(jù)父控件的伸縮而伸縮
如果還是使用系統(tǒng)提供的view的話璃岳,如何解決呢年缎?
代碼中childView.autoresizingMask =?UIViewAutoresizingNone
還有控制器的view,就算是 alloc ?init穿件出來(lái)的控制器對(duì)象铃慷,它的view的自動(dòng)伸縮屬性默認(rèn)也是可伸縮的单芜,這是蘋果默認(rèn)的做法
兩種情況是默認(rèn)可伸縮的:
1.從xib里面創(chuàng)建出來(lái)的默認(rèn)控件
2.控制器的view
如果不希望控件擁有自動(dòng)伸縮功能,應(yīng)該設(shè)置為None
在哪里設(shè)置呢犁柜?
在xib對(duì)應(yīng)的自定義類中的.h文件中awakeFromNib中洲鸠,只設(shè)置一次,這樣xib中設(shè)置的多少寬高馋缅,加載出來(lái)多少就是多少扒腕,不會(huì)發(fā)生變化