【Swift】UIViewController frame問題

問題場景:網(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)
    }

效果如下

554 頁面
  • 進階嘗試

有效果但是不完美,每次進入頁面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)
    }
554 高度

頁面frame一直都是這樣的:
554高度
  • 最后掙扎

找到禍亂之源,刪之。效果不錯。

// 禍亂之源
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等

2.UIViewController的frame改變大小

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

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

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