转载

每日一博 | iOS 状态栏和导航栏的控制

iOS的项目多数会遇到控制状态栏和导航栏的问题,比如隐藏状态栏、控制状态栏的文字颜色等,导航栏也有同样需求。

自从iOS7之后状态栏就是透明的了 高度 20.f   导航栏的高度是 64.f

状态栏的控制

状态栏的设置分为两种: 1.全局设置 2.分页面设置 控制这两种模式的开关是info.plist文件的配置项。1).Property List 下是 View controller-based status bar appearance 2).Source Code 下是 UIViewControllerBasedStatusBarAppearance

全局设置

在info.plist 文件中设置 View controller-based status bar appearance 为NO 设置为全局设置,即vc中的方法是无法控制的,真正的控制方法如下:

``` //设置状态栏字体颜色 [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent]; //设置状态栏是否隐藏 [[UIApplication sharedApplication] setStatusBarHidden:YES]; /* 状态栏字体颜色上呢 只是说改变对应枚举值进行颜色设置 不能做任意修改 UIStatusBarStyleDefault 黑色UIStatusBarStyleLightContent 白色

状态栏是否显示,一般而言app不会对所有界面都不显示状态栏,而是只在特定的页面需要隐藏状态栏,比如对于视频播放界面不希望显示状态栏。

对于状态栏的背景色设置,从ios7开始状态栏本身实际上是透明的,它的背景色其实取决于导航栏。 */ ```

分页面设置

在info.plist 文件中设置 View controller-based status bar appearance 为YES 设置为分页面VC设置控制,分两种情况: 1.VC不在UINavigationController 或者说VC是根控制器

状态栏字体颜色设置

` //直接设置导航栏字体颜色 - (UIStatusBarStyle)preferredStatusBarStyle { //返回白色 return UIStatusBarStyleLightContent; //返回黑色 //return UIStatusBarStyleDefault; }
在view的某个加载阶段比如viewWillAppear中,执行如下代码,这样更保险: ``

//刷新状态栏 [self setNeedsStatusBarAppearanceUpdate]; ```

隐藏控制

` //直接设置 - (BOOL)prefersStatusBarHidden { return YES; }

`

在view的某个加载阶段比如viewWillAppear中,执行如下代码,这样更保险:

` [self setNeedsStatusBarAppearanceUpdate];

`

2.当VC在UINavigationController中时(或者是VC不是根控制器),VC并不能通过上面的方式控制状态栏的颜色,需要通过如下方法间接控制:

状态栏字体颜色设置

` self.navigationController.navigationBar.barStyle = UIBarStyleBlack;

`

隐藏控制

这个就比控制状态栏字体颜色要复杂一些了,这个需要通过子VC控制根VC,从而达到控制根控制器的目的,方法如下: 假设根VC为TabVC,那么TabVC中要设置如下代码 ``` //TabVC //定义一个变量来控制状态栏显示,子VC通过修改这个值来间接控制 @property (nonatomic ,assign) BOOL statusBarHidden;

  • (BOOL)prefersStatusBarHidden { return _statusBarHidden; }

//子VC - (void)viewWillAppear:(BOOL)animated{ [super viewWillAppear:animated];

if([self.tabBarController respondsToSelector:@selector(setStatusBarHidden:)]){     [self.tabBarController performSelector:@selector(setStatusBarHidden:) withObject:@(YES)];     [self setNeedsStatusBarAppearanceUpdate]; }

}

  • (void)viewWillDisappear:(BOOL)animated{ [super viewWillDisappear:animated]; if([self.tabBarController respondsToSelector:@selector(setStatusBarHidden:)]){ //注意对NO的情况,不能传@NO,只能传nil才能被当成NO [self.tabBarController performSelector:@selector(setStatusBarHidden:) withObject:nil]; [self setNeedsStatusBarAppearanceUpdate]; } }

//可以看到在子VC中通过设置根VC的属性,并调用setNeedsStatusBarAppearanceUpdate后,根VC的prefersStatusBarHidden就会被调用,从而隐藏或显示状态栏。

```

导航栏

``` //iOS7 之后默认半透明 @property(nonatomic,assign,getter=isTranslucent) BOOL translucent //设置是否半透明

//这是导航栏背景色 这个设置方法可以在AppDelegate中设置,父类中设置,全局可以生效。 [[UINavigationBar appearance] setBarTintColor:[UIColor yellowColor]]; //导航栏背景色 控制器中也可以这么用 [self.navigationController.navigationBar setBarTintColor:[UIColor yellowColor]];

//导航栏设置背景图片 注意图片高度 44.f 将不会设置状态栏背景 64.f 可置顶部位置 全部设置 [[UINavigationBar appearance] setBackgroundImage:[UIImage imageNamed:@ "nav_bg.png" ] forBarMetrics:UIBarMetricsDefault];

//导航栏标题设置 //可以全局设置 在AppDelegate中 父类中 NSShadow *shadow = [[NSShadow alloc] init]; shadow.shadowColor = [UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:0.8]; shadow.shadowOffset = CGSizeMake(0, 1); [[UINavigationBar appearance] setTitleTextAttributes: [NSDictionary dictionaryWithObjectsAndKeys: [UIColor colorWithRed:245.0/255.0 green:245.0/255.0 blue:245.0/255.0 alpha:1.0], NSForegroundColorAttributeName, shadow, NSShadowAttributeName, [UIFont fontWithName:@ "HelveticaNeue-CondensedBlack" size:21.0], NSFontAttributeName, nil]]; //控制器中这么设置也可以 [self.navigationController.navigationBar setTitleTextAttributes:@{NSFontAttributeName: [UIFont systemFontOfSize:16.f],NSForegroundColorAttributeName:[UIColor WhiteColor]}];

//设置返回按钮(等系统按钮)可以通过TintColor,直接来设置颜色 [[UINavigationBar appearance] setTintColor:[UIColor whiteColor]]; ```

原文  http://my.oschina.net/snOS/blog/701365
正文到此结束
Loading...