解决方案:
在控制器中加上下面的语句:
// 被导航栏遮挡的处理
self.edgesForExtendedLayout = UIRectEdgeNone;
为了避免pop时,导航栏部分出现黑色,要设置window的颜色,这里以白色为例:
在AppDelegate.m文件的- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions中设置
把状态栏设置为白色设置并在开启状态隐藏状态栏也是在这个方法中设置:在设置这两项时,还要设置info.plish添加一下字段:
UIViewControllerBasedStatusBarAppearance:设置为NO
Status bar is initially hidden:设置为YES
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// 把状态栏设置为白色
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent animated:NO];
self.window.backgroundColor = [UIColor whiteColor];
// 启动时隐藏状态栏
[[UIApplication sharedApplication] setStatusBarHidden:NO withAnimation:UIStatusBarAnimationFade];
return YES;
}
控制器edgesForExtendedLayout属性说明:
在iOS7后默认viewController的View会延伸到最顶端,即使上面有导航条、状态栏,所以如果要让view在导航条下显示就要通过edgesForExtendedLayout来设置
1、在iOS7之前有导航栏的坐标是从导航栏的下部开始计算的
2、iOS7之后self.edgesForExtendedLayout = UIRectEdgeAll,有导航栏和状态栏,是从它们的上部开始计算的(即会穿透导航栏),也就是所有的UI控件都往上移动了44Pt
3、当然也有特殊情况:当控制请的第一个view是tableview、scrollview、collectionView时,即使有导航栏,也会自动从导航栏下面开始计算(这个是朋友跟我说的,自己还没去验证,先记下来,以后遇到再验证。要是不对请见谅,并告知,我好修改,谢谢)
4、如果控制器的第一个view不是第三点提到的特殊view,可以通过设置self.edgesForExtendedLayout = UIRectEdgeNone;让坐标系从导航栏下面开始计算,这时,相当于整个view向下移动了64Pt,所以最下面的64Pt会显示不出来,这点要注意。
iOS小菜鸟一枚,正努力振翅学飞!