iOS-從xib布局問題看viewController生命周期

最近?在學(xué)習(xí)的時(shí)候,發(fā)現(xiàn)viewController在用xib的時(shí)候會(huì)出現(xiàn)一些布局問題,就是xib文件中的view的size和實(shí)際運(yùn)行在設(shè)備的尺寸在某些方法中是不一樣的,這和viewController的生命周期有關(guān)系。

viewController打印


創(chuàng)建一個(gè)空項(xiàng)目,xib尺寸是固定的一個(gè)設(shè)備的尺寸,我用iphone6的尺寸做測(cè)試,運(yùn)行的時(shí)候選擇iphone6 plus的模擬器運(yùn)行,在vc生命周期的方法中打印vc的view尺寸的變化,可以看到viewDidLoad到viewWillAppear:中view的size都是xib的大小,到viewDidAppear的方法中才將view的大小按照模擬器的屏幕尺寸改回來,這樣如果平時(shí)習(xí)慣在viewDidLoad拿vc的view.size做子視圖布局參數(shù)就?很容易出錯(cuò)了,例如這樣一段代碼:

view創(chuàng)建

那么模擬器會(huì)這樣顯示

并不能覆蓋屏幕大小,是因?yàn)関iew在viewDidLoad里面加載的還是xib文件里的view,在viewDidAppear:方法里面view才能適配到設(shè)備本身尺寸;不過平時(shí)我們布局的代碼放到viewDidAppear也是不好的,這里要看看vc生命里其中的兩個(gè)方法,viewWillLayoutSubviews和viewDidLayoutSubviews,這兩方法和UIView的layoutSubviews類似,控制器加載完view后會(huì)再調(diào)用,和方法名意思一樣,在這兩個(gè)方法進(jìn)行對(duì)view包括子視圖進(jìn)行布局,所以我們可以在viewDidLoad或者?懶加載來創(chuàng)建子視圖,在viewWillLayoutSubviews對(duì)子視圖進(jìn)行布局設(shè)置;這對(duì)使用自動(dòng)布局效果更佳。

再來看看viewController的生命周期中控制器view的大小變化;


viewController生命周期

這個(gè)?面試經(jīng)常會(huì)問,根本view的變化在相應(yīng)的方法里做相應(yīng)的操作,領(lǐng)悟起來會(huì)更加直觀;對(duì)了,除了xib,storyboard和純代碼創(chuàng)建的viewContoller卻不會(huì)出現(xiàn)這個(gè)問題,還是在viewDidLoad里加上self.view.frame=[UIScreenmainScreen].bounds就能匹配到與屏幕一樣的大小,不知道這樣做有沒問題;有請(qǐng)?zhí)岢鰜?,?dāng)學(xué)習(xí)了~~。

第一次寫blog,寫的不好請(qǐng)多多指點(diǎn)下~~。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容