iOS 的 translucent 和automaticallyAdjustsScrollViewInsets

translucent

translucent屬性能決定UITabBar/UINavigationBar是否為半透明的效果.這個BOOL屬性能控制UITabBar/UINavigationBar的半透明效果,默認為YES,即默認情況下為半透明效果.

默認情況下,如果使用UITabBarController和UINavigationBarController(translucent屬性默認為YES)必指。
設置一個UITableView括饶,距離邊距是0.

    UITableView *tableView = [[UITableView alloc] initWithFrame:[UIScreen mainScreen].bounds];
    tableView.backgroundColor = [UIColor redColor];
    tableView.contentInset = UIEdgeInsetsMake(0, 0, 0, 0);
image.png

image.png

我們看到tableView雖然是占住整個屏幕但是還是沒有遮擋住cell,這是因為系統(tǒng)默認默認控制器屬性automaticallyAdjustsScrollViewInsets默認為YES来涨。

請注意:iOS11開始图焰,蘋果摒棄了automaticallyAdjustsScrollViewInsets屬性,改由contentInsetAdjustmentBehavior(枚舉值)控制蹦掐。

automaticallyAdjustsScrollViewInsets = YES時系統(tǒng)底層所干的事:

scrollView的內(nèi)容原本沒有內(nèi)邊距技羔,但是考慮到導航欄(高度44px)、狀態(tài)欄(高度20px)卧抗、TabBar(高度49px)會擋住后面scrollView所展示的內(nèi)容藤滥,系統(tǒng)自動為scrollView增加上下的內(nèi)邊距。
一旦手動在系統(tǒng)布局頁面之前設置automaticallyAdjustsScrollViewInsets = NO社裆,將會取消上述操作拙绊,屆時scrollView內(nèi)容將會被部分擋住。
請注意:上述的情況僅僅對UIScrollView或者子類(如UITableView)有效泳秀。
當我們添加:

self.navigationController.navigationBar.translucent = NO;
image.png

此時tableView的往下移動了64px标沪。

總結(jié):


1、navigationBar.translucent 默認是YES嗜傅,此時布局的起始點是(0,0)金句。
2、navigationBar.translucent 設置為NO吕嘀,原點坐標在(0,64)违寞。


當navigationBar.translucent為YES,automaticallyAdjustsScrollViewInsets 設置為No的時候偶房,此時cell被遮擋住.


image.png

當navigationBar.translucent為NO趁曼,automaticallyAdjustsScrollViewInsets 設置為No的時候,此時cell上面沒被遮擋住.


image.png

當navigationBar.translucent = NO棕洋, tabBar.translucent = NO 的時候彰阴,下面其實還是被遮擋住。

automaticallyAdjustsScrollViewInsets用法

1拍冠、單獨設置self.automaticallyAdjustsScrollViewInsets

self.automaticallyAdjustsScrollViewInsets = NO;

2尿这、self.edgesForExtendedLayout聯(lián)合設置,原點就是(0庆杜,64)開始

self.automaticallyAdjustsScrollViewInsets = NO;
self.edgesForExtendedLayout = UIRectEdgeNone;

當屏幕會多出一個64的高度的時候射众,系統(tǒng)就會自動根據(jù)UINavigationBar和statusBar將view下移64,frame從(0晃财,64)開始叨橱。這樣典蜕,我們在布局內(nèi)部控件的時候依然可以從(0,0)開始罗洗,而不必擔心上部被UINavigationBar遮擋了.

iOS11+,contentInsetAdjustmentBehavior定義及使用(替代automaticallyAdjustsScrollViewInsets)

如果只想單純地設置導航條不偏移導航條+狀態(tài)欄和Tabbar高度

/* Configure the behavior of adjustedContentInset.
 Default is UIScrollViewContentInsetAdjustmentAutomatic.
 中文解析:該屬性用來配置UIScrollView調(diào)整內(nèi)邊距的行為愉舔,其值為枚舉值,默認值是UIScrollViewContentInsetAdjustmentAutomatic伙菜,就是自動調(diào)整轩缤。
 */
@property(nonatomic) UIScrollViewContentInsetAdjustmentBehavior contentInsetAdjustmentBehavior API_AVAILABLE(ios(11.0),tvos(11.0));

// 以下是該枚舉的具體值(選項)
typedef NS_ENUM(NSInteger, UIScrollViewContentInsetAdjustmentBehavior) {
    // 中文解析:與UIScrollViewContentInsetAdjustmentScrollableAxes相似,但為了向后兼容(向低版本兼容)贩绕,當scroll view被view controller管理火的,且該view controller的automaticallyAdjustsScrollViewInsets = YES并在導航條控制器棧內(nèi),該枚舉也會調(diào)整頂部(導航條)和底部(Tabbar)的內(nèi)邊距淑倾,無論該scroll view是否可滾動馏鹤。
    UIScrollViewContentInsetAdjustmentAutomatic, // Similar to .scrollableAxes, but for backward compatibility will also adjust the top & bottom contentInset when the scroll view is owned by a view controller with automaticallyAdjustsScrollViewInsets = YES inside a navigation controller, regardless of whether the scroll view is scrollable

    // 中文解析:滾動軸的邊緣會被調(diào)整(例如contentSize.width/height > frame.size.width/height 或 alwaysBounceHorizontal/Vertical = YES)
    UIScrollViewContentInsetAdjustmentScrollableAxes, // Edges for scrollable axes are adjusted (i.e., contentSize.width/height > frame.size.width/height or alwaysBounceHorizontal/Vertical = YES)

    // 中文解析:內(nèi)邊距不會被調(diào)整
    UIScrollViewContentInsetAdjustmentNever, // contentInset is not adjusted

    // 中文解析:內(nèi)邊距總是被scroll view的safeAreaInsets所調(diào)整,safeAreaInsets顧名思義就是safeArea的內(nèi)邊距娇哆,safeArea下面會有一個概括性的解釋湃累。
    UIScrollViewContentInsetAdjustmentAlways, // contentInset is always adjusted by the scroll view's safeAreaInsets
} API_AVAILABLE(ios(11.0),tvos(11.0));

非ScrollView的布局需求

UINavigationBar和statusBar 在默認情況下都是半透明的,要求:在上面添加控件碍讨,從(0脱茉,0)點開始布局,內(nèi)容不被遮擋垄开,可以正常顯示琴许。

UINavigationBar和statusBar保留半透明效果時
1、手動布局溉躲,計算UINavigationBar和statusBar的占位榜田,上面從(0,64)開始布局锻梳,整個空間的布局長度是[UIScreen mainScreen].bounds.size.heigh-64-49,iphoneX的時候則是:[UIScreen mainScreen].bounds.size.heigh-88-49-34箭券。


image.png

2、修改viewController的edgesForExtendedLayout屬性疑枯,edgesForExtendedLayout = UIRectEdgeNone辩块。設置后,控制器的view的frame的坐標Y增加64px緊挨著navigationBar下方荆永,底部同理废亭,該屬性支持iOS7及以后的版本。(注意:這里雖然看著導航條和TabBar還有半透明效果具钥,但是實際上下面的內(nèi)容已經(jīng)無法再”穿透“了豆村。)


image.png

UINavigationBar和statusBar不保留半透明效果時
UINavigationBar和statusBar設置為NO,此時NavigationBar和statusBar都是白色的不透明

iOS11:

在iOS11中UIViewController的automaticallyAdjustsScrollViewInsets屬性被廢棄骂删,不再起作用掌动, 取而代之的是UIScrollView中新增的屬性contentInsetAdjustmentBehavior四啰。

self.extendedLayoutIncludesOpaqueBars = YES;
if (@available(iOS 11.0, *)) {
        self.tableView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
} else {
        self.automaticallyAdjustsScrollViewInsets = NO;
}
_tableView.contentInset = UIEdgeInsetsMake(64, 0, 49, 0);
_tableView.scrollIndicatorInsets = _tableView.contentInset;

全屏效果的app

在ios7之后,為了達到全屏效果粗恢,在UIViewController中添加了幾個屬性:

@property(nonatomic,assign) UIRectEdge edgesForExtendedLayout NS_AVAILABLE_IOS(7_0); // Defaults to UIRectEdgeAll
@property(nonatomic,assign) BOOL extendedLayoutIncludesOpaqueBars NS_AVAILABLE_IOS(7_0); // Defaults to NO, but bars are translucent by default on 7_0.  
@property(nonatomic,assign) BOOL automaticallyAdjustsScrollViewInsets API_DEPRECATED_WITH_REPLACEMENT("Use UIScrollView's contentInsetAdjustmentBehavior instead", ios(7.0,11.0),tvos(7.0,11.0)); // Defaults to YES

edgesForExtendedLayout:離四周的距離柑晒,默認UIRectEdgeAll,意為上下左右填充滿整個屏幕眷射。


UIViewController添加到UINavigationController上時匙赞,默認UIViewController的原點是在(0,0)處凭迹。
當self.edgesForExtendedLayout = UIRectEdgeNone;時,
UIViewController的原點是在(0苦囱,64/88)處嗅绸。
UIViewController.y = UINavigationBar.y + UINavigationBar.h;
此時可以設置navigationBar.translucent = NO撕彤,讓導航欄不半透明鱼鸠。

UITableViewController添加到UITabBarController上時,UITableViewController的底部一部分cell會被TabBar擋住.
設置:self.edgesForExtendedLayout = UIRectEdgeNone;
UITableViewController.tabbar的y = CGRectGetMaxY(UITableViewController);


extendedLayoutIncludesOpaqueBars:延伸視圖包含不包含不透明的Bar,是用來指定導航欄是透明的還是不透明.

YES 是透明羹铅,NO是不透明蚀狰。

automaticallyAdjustsScrollViewInsets

YES時,scrollView职员、tableview麻蹋,在設置完數(shù)據(jù)的時候,內(nèi)部會改變contentInsets的top值為64焊切。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末扮授,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子专肪,更是在濱河造成了極大的恐慌刹勃,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件嚎尤,死亡現(xiàn)場離奇詭異荔仁,居然都是意外死亡,警方通過查閱死者的電腦和手機芽死,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進店門乏梁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人关贵,你說我怎么就攤上這事掌呜。” “怎么了坪哄?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵质蕉,是天一觀的道長势篡。 經(jīng)常有香客問我,道長模暗,這世上最難降的妖魔是什么禁悠? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮兑宇,結(jié)果婚禮上碍侦,老公的妹妹穿的比我還像新娘。我一直安慰自己隶糕,他們只是感情好瓷产,可當我...
    茶點故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著枚驻,像睡著了一般濒旦。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上再登,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天尔邓,我揣著相機與錄音,去河邊找鬼锉矢。 笑死梯嗽,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的沽损。 我是一名探鬼主播灯节,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼绵估!你這毒婦竟也來了显晶?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤壹士,失蹤者是張志新(化名)和其女友劉穎磷雇,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體躏救,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡唯笙,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了盒使。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片崩掘。...
    茶點故事閱讀 39,785評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖少办,靈堂內(nèi)的尸體忽然破棺而出苞慢,到底是詐尸還是另有隱情,我是刑警寧澤英妓,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布挽放,位于F島的核電站绍赛,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏辑畦。R本人自食惡果不足惜吗蚌,卻給世界環(huán)境...
    茶點故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望纯出。 院中可真熱鬧蚯妇,春花似錦、人聲如沸暂筝。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽焕襟。三九已至陨收,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間胧洒,已是汗流浹背畏吓。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工墨状, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留卫漫,地道東北人。 一個月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓肾砂,卻偏偏與公主長得像列赎,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子镐确,可洞房花燭夜當晚...
    茶點故事閱讀 44,713評論 2 354

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

  • 先聲明:以下總結(jié)只對ios7及ios7之后才有效~~~ 之前開發(fā)過程中偶爾會遇到設置導航欄透明與否或者運行系統(tǒng)版本...
    Qiu_W閱讀 1,301評論 0 1
  • 目錄: NavigationBar 由導航欄引起的零點坐標問題 TabBar StatusBar NSAttrib...
    Ryan___閱讀 1,696評論 0 6
  • 最近項目里有個需求和導航欄的樣式定制有關源葫,深入之后發(fā)現(xiàn)之前理解的一些概念有些模糊诗越,剛好趁著這次機會全面整理了一下。...
    Kevin追夢先生閱讀 498評論 0 0
  • 最近項目里有個需求和導航欄的樣式定制有關息堂,深入之后發(fā)現(xiàn)之前理解的一些概念有些模糊嚷狞,剛好趁著這次機會全面整理了一下。...
    hi_xgb閱讀 5,077評論 4 39
  • 這世上最讓你痛心的事莫過于你在乎的人拒絕你還他的人情荣堰,卻不斷讓你欠他人情床未。 我們總是想著互相在乎,其實你欠我我欠你...
    東條二十閱讀 205評論 0 0