iOS7及以上版本有改動(dòng)浪感,UITabBar類添加了一個(gè)translucent屬性答渔,UINavigationBar類中的translucent屬性也默認(rèn)修改為YES。也就是說默認(rèn)使用了這兩個(gè)bar之后箫荡,顯示的是半透明的效果说榆,能夠模糊看到被bar遮蓋的東西。這會(huì)導(dǎo)致一些問題牛郑,比如配色的色差以及控件位置起點(diǎn)的問題怠肋。
默認(rèn)情況下,我們使用UINavigationController和UITabBarController淹朋,而且不修改其中的translucent等屬性笙各,在頁(yè)面中添加tableView,設(shè)置tableview距離四面【0础芍,0杈抢,0,0】并設(shè)置tableview的背景色為red仑性,則界面顯示如下:
可以發(fā)現(xiàn)界面的上bar覆蓋的紅色能模糊看到惶楼,是半透明效果。但是我們還是可以正痴锔耍看到第一個(gè)(上下滑動(dòng))歼捐,不會(huì)被半透明遮擋。
這是因?yàn)閷?duì)于滾動(dòng)視圖的特殊性:
對(duì)于滾動(dòng)視圖晨汹,系統(tǒng)默認(rèn)viewControllerautomaticallyAdjustsScrollViewInsets
屬性為YES豹储,所以默認(rèn)會(huì)做下面這件事:
本來我們的cell是放在(0,0)的位置上的,但是考慮到導(dǎo)航欄淘这、狀態(tài)欄會(huì)擋住后面的主視圖剥扣,而自動(dòng)把我們的內(nèi)容(cell、滾動(dòng)視圖里的元素)向下偏移離Top64px(下方位置如果是tarbar向上偏移離Buttom49px铝穷、toolbar是44)钠怯,也就是當(dāng)我們把navigationBar給隱藏掉時(shí),滾動(dòng)視圖會(huì)給我們的內(nèi)容預(yù)留部分的空白Top(所有內(nèi)容向下偏移20px曙聂,因?yàn)闋顟B(tài)欄的存在)晦炊。
我們修改這一屬性,在viewDidLoad方法中添加以下代碼:
self.automaticallyAdjustsScrollViewInsets = NO;//取消自動(dòng)滾動(dòng)調(diào)整筹陵,默認(rèn)為YES
我們就會(huì)看到下面的效果圖:
也就是說系統(tǒng)沒有再做上面那件事了刽锤,所以滾動(dòng)視圖沒有為里面 的內(nèi)容留下對(duì)應(yīng)的空間,所以我們看不到最上面的內(nèi)容了(滾動(dòng)也會(huì)滾回去)朦佩。 ?
但是對(duì)于非滾動(dòng)視圖是沒有這種特殊性的
如果我們?cè)趖ableview上方加一塊青綠色的Button“緊貼著”tableview(也就是設(shè)置四邊【0并思,0,0语稠,0】)宋彼,并且我們還是使用的默認(rèn)的這一屬性:
self.automaticallyAdjustsScrollViewInsets = YES;?
也就是說對(duì)于非滾動(dòng)視圖并沒有這樣的特殊性弄砍,頂部的內(nèi)容會(huì)被bar遮擋掉。但是在半透明(translucent屬性為YES)的前提下输涕,automaticallyAdjustsScrollViewInsets屬性還是為YES的時(shí)候音婶,滾動(dòng)視圖還是會(huì)自動(dòng)空出64px的位置,也就是我們看到的紅色背景莱坎。
那么現(xiàn)在問題來了:對(duì)于非滾動(dòng)視圖衣式,我想讓它從(0,0)布局檐什,但是又正常顯示碴卧,不會(huì)被遮擋該怎么做呢?
首先乃正,這個(gè)需要分兩種效果:是否需要半透明的效果
1住册,依舊保留半透明效果:也就是說tabBar和navigationBar的translucnet還是默認(rèn)的YES時(shí):
方法1:你可以不從(0,0)開始布局瓮具,而是從(0荧飞,64)開始布局(同理,底部的tabBar也要留下位置)
方法2:你一定要從(0名党,0)開始布局叹阔,則修改viewController的一個(gè)屬性:
self.edgesForExtendedLayout = UIRectEdgeNone;//iOS7及以后的版本支持,self.view.frame.origin.y會(huì)下移64像素至navigationBar下方兑巾。
則我們會(huì)看到下面的效果:
2条获,不保留半透明效果:也就是將tabBar和navigationBar的translucnet屬性都改為NO忠荞,其他不做修改蒋歌,這種情況,我們看到的效果圖如下:
可以看到委煤,上下的bar已經(jīng)是白色堂油,而不是半透明。底色是白色碧绞, 那么在設(shè)置顏色的時(shí)候就不會(huì)再有色差了府框!
但是對(duì)于,不保留半透明效果讥邻,但是又是從(0迫靖,64)開始布局的,我還不知道怎樣處理能正常顯示兴使!
ios7下的app都是全屏的系宜,意思就是所有控制器的view默認(rèn)都是從屏幕的(0,0)開始发魄。
為了達(dá)到全屏效果的app盹牧,官方為UIviewController增加了幾個(gè)屬性:
1 @property(nonatomic,assign) UIRectEdge edgesForExtendedLayout NS_AVAILABLE_IOS(7_0); // Defaults to UIRectEdgeAll
2 @property(nonatomic,assign) BOOL extendedLayoutIncludesOpaqueBars NS_AVAILABLE_IOS(7_0); // Defaults to NO, but bars are translucent by default on 7_0.
3 @property(nonatomic,assign) BOOL automaticallyAdjustsScrollViewInsets NS_AVAILABLE_IOS(7_0); // Defaults to YES
一:
屬性edgesForExtendedLayout俩垃,意思大概是邊緣向四周展開
edgesForExtendedLayout 值是結(jié)構(gòu)體,默認(rèn)值是 UIRectEdgeAll汰寓,
也就是說口柳,當(dāng)一個(gè)控制器要往父控制器添加的時(shí)候,上下左右填充滿整個(gè)屏幕有滑。
例如1:
UIViewController添加到uiNavController上時(shí)跃闹,uiviewcontroller的y值 == 狀態(tài)欄的的y
這時(shí)候設(shè)置
self.edgesForExtendedLayout = UIRectEdgeNone;
uiviewcontroller的y值 == 導(dǎo)航欄y + 導(dǎo)航欄height
/*
這種情況還可以設(shè)置,導(dǎo)航欄的bar的透明度屬性translucent為no
self.navigationController.navigationBar.translucent = NO;
translucent屬性在ios6之前默認(rèn)為no毛好,
而在ios7下的導(dǎo)航欄默認(rèn)卻是半透明的辣卒,為yes,所以該屬性不會(huì)占據(jù)空間睛榄。
*/
例如2:
UITableViewController添加到UITabBarController上時(shí)荣茫,UITableViewController的底部一部分cell會(huì)被TabBar擋住
這時(shí)候設(shè)置
self.edgesForExtendedLayout = UIRectEdgeNone;
TabBar的y值 == CGRectGetMaxY(UITableViewController)
二 :
self.extendedLayoutIncludesOpaqueBars = YES;
意思展開包括狀態(tài)欄
sectionHeaderHeight 高度不一樣
若要達(dá)到每個(gè)group頭部等高效果,
_tableview.sectionHeaderHeight = 10;(頭部的等高我設(shè)置的10)
_tableview.sectionFooterHeight = 0;