全屏布局(fullScreenLayout)那些事

圖片來源@百度圖片

當(dāng)我們使用UINavigationController時,插入一個控制器,然后往這個控制器的view上加subview(比如一個tableView)時,經(jīng)常會碰到tableView的實際展示跟自己設(shè)置的frame不一致的情況。這里就總結(jié)記錄一下平時自己遇到過的相關(guān)問題。

iOS7之前控制器有一個屬性wantsFullScreenLayout。當(dāng)把它設(shè)置為YES時,你添加的subview的y就是從屏幕的最頂部開始算,包含navigationbar,設(shè)置為NO時,則從navigationbar的bottom開始算。因為iOS7之前,navigationbar默認一般是不透明的,所以wantsFullScreenLayout一般默認為NO。從iOS7開始,這個屬性被廢棄了,代替它的是三個新的屬性:edgesForExtendedLayoutextendedLayoutIncludesOpaqueBarsautomaticallyAdjustsScrollViewInsets,今天重點說的就是這三個經(jīng)常用的屬性。

edgesForExtendedLayout

The extended edges to use for the layout.
This property is applied only to view controllers that are embedded in a container such as UINavigationController. The window’s root view controller does not react to this property. The default value of this property is UIRectEdgeAll

這個屬性是通過擴展子視圖的邊緣來適配屏幕,因為iOS7之后鼓勵全屏,navigationbar變得半透明,所以這個屬性默認為UIRectEdgeAll,及x和y是從屏幕的左上角開始算的。比如設(shè)置tableView的frame如下:

self.tableView.frame = CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, 350);

這里為了防止automaticallyAdjustsScrollViewInsets的干擾,我們在viewDidAppear:方法里加上一句代碼,下文會細說。

// 相當(dāng)于把automaticallyAdjustsScrollViewInsets設(shè)置為NO了
self.tableView.contentInset = UIEdgeInsetsZero;

效果如下圖:

UIRectEdgeAll

當(dāng)如下更改edgesForExtendedLayout的設(shè)置時

self.edgesForExtendedLayout = UIRectEdgeNone;

效果如下:

UIRectEdgeNone

顯然這是我們要的tableView效果,但是我們發(fā)現(xiàn)navigationbar的顏色變灰了,這是因為navigationbar是半透明的,但是navigationbar下面沒有視圖。

這時我們可以通過改變navigationbar的透明度來實現(xiàn)。

self.navigationController.navigationBar.translucent = NO;   
//    self.edgesForExtendedLayout = UIRectEdgeNone;

設(shè)置不透明之后,subview的邊緣就擴展不到頂部上了,只能到navigationbar的底部。效果

extendedLayoutIncludesOpaqueBars

A Boolean value indicating whether or not the extended layout includes opaque bars.
The default value of this property is NO

這個屬性是指當(dāng)navigationbar不透明時,layout是否包含navigationbar。當(dāng)navigationbar透明時,此屬性不起作用。比如在上面設(shè)置不透明的基礎(chǔ)上,把這個屬性設(shè)置為YES(該屬性默認NO),

self.navigationController.navigationBar.translucent = NO;  
//    self.edgesForExtendedLayout = UIRectEdgeNone;
self.extendedLayoutIncludesOpaqueBars = YES;

發(fā)現(xiàn)tableView的y從屏幕最頂部開始算了。

extendedLayoutIncludesOpaqueBars

automaticallyAdjustsScrollViewInsets

A Boolean value that indicates whether the view controller should automatically adjust its scroll view insets.
The default value of this property is YES, which lets container view controllers know that they should adjust the scroll view insets of this view controller’s view to account for screen areas consumed by a status bar, search bar, navigation bar, toolbar, or tab bar. Set this property to NO if your view controller implementation manages its own scroll view inset adjustments.

這個屬性太強大了,它會根據(jù)navigationbar和tabbar的存在,自動調(diào)整scrollView的contentInset。如下圖

automaticallyAdjustsScrollViewInsets

透過半透明的navigationbar可以看到tableView的y其實還是在屏幕的最頂部,但是第一個cell已經(jīng)變成從navigationbar的底部開始了,這是因為automaticallyAdjustsScrollViewInsets屬性默認為YES,tableView的contentInset已經(jīng)由UIEdgeInsetsZero自動調(diào)整為UIEdgeInsetsMake(64, 0, 0, 0)了。當(dāng)我們設(shè)置self.automaticallyAdjustsScrollViewInsets = NO;時,就變成上文第一張效果圖的效果了。但是它也有不足,就是scrollview必須是根視圖添加的第一個子視圖,否則此屬性無效。

最后

這都是作者在實際工作中的一些總結(jié),如有不對之處,歡迎指正。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,963評論 6 542
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,348評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,083評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,706評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 72,442評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,802評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,795評論 3 446
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,983評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,542評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 41,287評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,486評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,030評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,710評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,116評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,412評論 1 294
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,224評論 3 398
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 48,462評論 2 378

推薦閱讀更多精彩內(nèi)容

  • /* UIViewController is a generic controller base class th...
    DanDanC閱讀 1,840評論 0 2
  • 1.badgeVaule氣泡提示 2.git終端命令方法> pwd查看全部 >cd>ls >之后桌面找到文件夾內(nèi)容...
    i得深刻方得S閱讀 4,707評論 1 9
  • *7月8日上午 N:Block :跟一個函數(shù)塊差不多,會對里面所有的內(nèi)容的引用計數(shù)+1,想要解決就用__block...
    炙冰閱讀 2,512評論 1 14
  • 嗨,你們好 嗨,好久不見 叮咚,門鈴響了 一如既往的打開一扇門,二扇門 突然來了一句:“小王,今天讓你做的,做完了...
    _似錦年華閱讀 493評論 0 2
  • 無意遇到簡書,看著下載評論里很多人因簡書而興奮和滿足,被他們感染了,也下載了下來。對于我這種接受填鴨式教育且...
    f29e1084117a閱讀 178評論 0 0