在iOS 7中,蘋果引入了一個(gè)新的屬性,叫做[UIViewController setEdgesForExtendedLayout:],它的默認(rèn)值為UIRectEdgeAll。當(dāng)你的容器是navigation controller時(shí),默認(rèn)的布局將從navigation bar的頂部開始。這就是為什么所有的UI元素都往上漂移了44pt。有時(shí)會(huì)加上頂部tool bar的高度 20, 20+44 = 64。而且下面tabbar也縮進(jìn)的49
解決辦法
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view.
if (OSVersionIsAtLeastiOS7()) {
if ([self respondsToSelector:@selector(edgesForExtendedLayout)])
{
self.edgesForExtendedLayout = UIRectEdgeNone;
}
}
}
如果設(shè)置成 self.edgesForExtendedLayout = UIRectEdgeBottom;那么就會(huì)self.view.frame是從navigationBar下面開始計(jì)算一直到屏幕底部;
如果設(shè)置成 self.edgesForExtendedLayout = UIRectEdgeNone;那么就會(huì)self.view.frame是從navigationBar下面開始計(jì)算一直到屏幕tabBar上部;
如果設(shè)置成 self.edgesForExtendedLayout = UIRectEdgeTop;那么就會(huì)self.view.frame是從navigationBar上面計(jì)算面開始計(jì)算一直到屏幕tabBar上部;
iOS7以上系統(tǒng),self.navigationController.navigationBar.translucent默認(rèn)為YES,self.view.frame.origin.y從0開始(屏幕最上部)。
此時(shí)若是添加代碼self.edgesForExtendedLayout = UIRectEdgeNone(iOS7.0以后方法);self.view.frame.origin.y會(huì)下移64像素至navBar下方開始。但是此時(shí)當(dāng)push到一個(gè)新的controller之前給當(dāng)前屏幕截圖的時(shí)候[self.view.layer renderInContext:UIGraphicsGetCurrentContext()];,由于navBar是透明的,會(huì)出現(xiàn)64像素的黑色區(qū)域。
此時(shí)只需要把self.navigationController.navigationBar.translucent=NO即可,不需要加代碼self.edgesForExtendedLayout;
iOS7之后也增加了一個(gè)self.tabBarController.tabBar.translucent的屬性,默認(rèn)為YES。當(dāng)應(yīng)用同時(shí)使用navBar和TabBar的時(shí)候。設(shè)置self.tabBarController.tabBar.translucent=NO并且self.navigationController.navigationBar.translucent=NO時(shí)候,得到self.view.frame--->{{0, 64}, {320, 455}}。視圖的高度也改變?yōu)閚avBar和tabBar之間的455像素。當(dāng)self.navigationController.navigationBar.translucent=YES并且self.tabBarController.tabBar.translucent=NO的時(shí)候self.view.frame--->{{0, 0}, {320, 519}};其都為YES的時(shí)候self.view.frame--->{{0, 0}, {320, 568}};
注意:設(shè)置self.edgesForExtendedLayout = UIRectEdgeNone;的時(shí)候會(huì)使得navBar和tabBar都不占空間。self.view.frame--->{{0, 64}, {320, 455}}。此時(shí)iOS7默認(rèn)navBar和tabBar都是透明的。截圖的時(shí)候需要注意。
iOS6以下系統(tǒng),默認(rèn)navBar和tabBar都不占空間。