Navigation Controller是一个container view controller。可以在viewController中通过以下方法设置navigation 栈中viewController view的布局:
edgesForExtendedLayout属性
默认为UIRectEdgeAll,即使视图中上有navigationBar,下有tabBar,那么视图仍会延伸覆盖到四周的区域。通过设置edgesForExtendedLayout属性指定view边缘要延伸的方向,可以控制视图是否会延伸到Navigation Bar和Tool Bar下。
如果不想让view延伸到bar下,可以将edgesForExtendedLayout属性设置为UIRectEdgeNone,这时会发现bar的颜色变灰。如图设置self.edgesForExtendedLayout = UIRectEdgeTop效果
如下代码:
self.navigationController.navigationBar.translucent = NO; self.navigationController.toolbar.translucent = NO;
设置Navigation Bar和Tool Bar不透明,也可以实现view不延伸到Navigation Bar和Tool Bar下的效果,且bar的颜色不会变灰,此时edgesForExtendedLayout属性设置失效。如图设置self.navigationController.toolbar.translucent = NO效果
extendedLayoutIncludesOpaqueBars属性
属性默认为NO,即视图不会延伸到不透明的bar下。如果为YES,则即使Navigation Bar或Tool Bar的translucent属性为NO不透明,依然可以通过设置edgesForExtendedLayout属性,实现视图可以延伸到Navigation Bar或Tool Bar下。
automaticallyAdjustsScrollViewInsets
属性默认为YES。此时如果屏幕中有status bar、search bar、navigation bar、toolbar或 tab bar,程序会自动调整scrollView在这些视图之间显示,而不会被它们覆盖。
self.edgesForExtendedLayout = UIRectEdgeAll;//默认UIRectEdgeAll self.automaticallyAdjustsScrollViewInsets = YES;//默认为YES
效果如下:
self.edgesForExtendedLayout = UIRectEdgeNone; self.automaticallyAdjustsScrollViewInsets = YES;//默认为YES
效果如下:
两种情况下automaticallyAdjustsScrollViewInsets属性都为YES,都可以实现自动调整scrollView尺寸,使tableview可以在bar之间正常显示,不会出现顶部或底部cell被bar遮挡的情况。仔细观察可以发现self.edgesForExtendedLayout属性为UIRectEdgeAll时,tableView上下滚动时可以穿过bar,从图3.1可以看到toolbar呈现出淡淡的绿色(tableview中cell的颜色)。