問題場景:網(wǎng)上復制粘貼了一串代碼,出現(xiàn)了view高度不等于MainScreen高度。
- 基礎(chǔ)嘗試
結(jié)果無效
// 基礎(chǔ)嘗試 無效
open override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
self.view.frame = CGRect(x: 0, y: 0, width: SCREENW, height: SCREENH)
}
open override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
self.view.frame = CGRect(x: 0, y: 0, width: SCREENW, height: SCREENH)
}
效果如下

- 進階嘗試
有效果但是不完美,每次進入頁面viewDidLayoutSubviews都會被調(diào)起5次,并且最后一次產(chǎn)生效果,會出現(xiàn)屏幕延遲刷新的感覺,體驗不好。
open override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
print(self.view.frame)
self.view.frame = CGRect(x: 0, y: 0, width: SCREENW, height: SCREENH)
}


- 最后掙扎
找到禍亂之源,刪之。效果不錯。
// 禍亂之源
if self.responds(to: #selector(setter: edgesForExtendedLayout)) {
self.edgesForExtendedLayout = []
}
self.extendedLayoutIncludesOpaqueBars = false
- 禍亂剖析
controller初始化并未對view進行處理,這時view的屬性為nil。之后一旦訪問view屬性,只要為nil,則開始加載view。如果有nib,則從nib自動加載。如果沒有則動用Controller的loadview方法。此時在loadview里,若使用[super loadview]; 則會更具window的大小,創(chuàng)建一個默認的view。如果要自定義view,則不要去調(diào)這行代碼。之后view屬性設(shè)置好以后,則會調(diào)用viewdidload;而viewWillAppear和viewDidApper在addsubview的時候調(diào)用
-[UIView addSubview:]
-[_setViewAppearState:isAnimating:]
-[layoutSubviews]
-[viewDidAppear]
edgesForExtendedLayout
指定邊緣要延伸的方向,iOS7鼓勵全屏布局模式,默認值是UIRectEdgeAll。
沒用過的人可能不知道這是什么意思,舉例假如我們頁面上面有導航了,這個時候頁面起始點仍然從狀態(tài)欄上方開始計算,舉例子你一個視圖要全屏顯示就要設(shè)置成:
CGRectMake(0, 64, SCREENW, self.view.frame.size.height - 64)
extendedLayoutIncludesOpaqueBars
延伸視圖包含不包含不透明的Bar,是用來指定導航欄是透明的還是不透明,iOS7中默認是YES,當滾動頁面的時候我們隱約能在導航欄下面看到我們頁面的視圖。
但是當我們設(shè)置一張不透明的圖片作為導航欄背景時,該屬性就會變成NO,這樣不透明以后我們可以人為設(shè)置成YES達到延伸至導航欄的效果:
只有到兩個屬性都設(shè)置成可以延伸時,頁面起始點才會從狀態(tài)欄也就是屏幕最左上角開始
if self.responds(to: #selector(setter: edgesForExtendedLayout)) {
self.edgesForExtendedLayout = []
}
self.extendedLayoutIncludesOpaqueBars = false
參考文章
1.iOS7之后的適配屬性講解edgesForExtendedLayout、extendedLayoutIncludesOpaqueBars等