iOS app 状态栏隐藏与颜色

在IOS7以前我们只需要执行[UIApplication  sharedApplication].statusBarHidden = YES 或者 Status bar is initially hidden    为 YES 即可隐藏状态栏。


可这段代码在IOS7上行不通!在IOS7上隐藏状态栏有两种方法:
  //方法一(代码设置):
在uiviewcontroller的子类下,调用:

    if ([self respondsToSelector:@selector(setNeedsStatusBarAppearanceUpdate)])

 {    [self prefersStatusBarHidden];     }

- ( BOOL )prefersStatusBarHidden {       return   YES ; }
  在视图切换,比如addsubview,present,pushin等,也需要注意及修改该状态栏。

//方法二(在plist里设置):


对ios7以下都适用

首先设置key:Status bar is initially hidden    为YES (iOS7 之前仅设置此项即可,但7下仅设置此项不行。)
然后设置key:View controller-based status bar appearance  为NO

即可实现全局隐藏状态栏了 


有一个问题就是自定义的viewController用上述方法是可以隐藏状态栏的,但一些系统定义的viewController比如MFMessageComposerViewController和MFMailComposerViewController,UIPeoplePickerViewController,UIImagePickerViewcontorller这些是不能隐藏状态栏的,

解决方法是重写UIViewController的- (BOOL)preferStatusBarHidden方法,然后把所有的viewController都引用这个重写的类的.h,就可以实现真正意义上的隐藏状态栏。


改变状态栏的颜色:

如果觉得在iOS 7启动期间状态栏黑色不合你意,以下方法可改变Status bar style成白色

在工程的plist添加 Status bar style,改变style值

默认是Gray style,选择后面两个任意一个都可以


状态栏的字体颜色只能是黑白两色,不能设置其它颜色。

状态栏的字体为黑色:UIStatusBarStyleDefault 

状态栏的字体为白色:UIStatusBarStyleLightContent


一、在info.plist中,将View controller-based status bar appearance设为NO


状态栏字体的颜色只由下面的属性设定,默认为白色:

// default is UIStatusBarStyleDefault

[UIApplication sharedApplication].statusBarStyle


解决个别vc中状态栏字体颜色不同的办法


1、在info.plist中,将View controller-based status bar appearance设为NO.

2、在app delegate中:

   [UIApplication sharedApplication].statusBarStyle = UIStatusBarStyleLightContent;


3、在个别状态栏字体颜色不一样的vc中


-(void)viewWillAppear:(BOOL)animated{

    [UIApplication sharedApplication].statusBarStyle = UIStatusBarStyleDefault;

}


-(void)viewWillDisappear:(BOOL)animated

{

    [super viewWillDisappear:animated];

    [UIApplication sharedApplication].statusBarStyle = UIStatusBarStyleLightContent;

}


二、在info.plist中,将View controller-based status bar appearance设为YES,或者没有设置。


View controller-based status bar appearance的默认值就是YES。


如果View controller-based status bar appearance为YES。

则[UIApplication sharedApplication].statusBarStyle 无效。


用下面的方法:

1、在vc中重写vc的preferredStatusBarStyle方法。

-(UIStatusBarStyle)preferredStatusBarStyle

{

    return UIStatusBarStyleDefault;

}

2、在viewDidload中调用:[self setNeedsStatusBarAppearanceUpdate];


但是,当vc在nav中时,上面方法没用,vc中的preferredStatusBarStyle方法根本不用被调用。

原因是,[self setNeedsStatusBarAppearanceUpdate]发出后,

只会调用navigation controller中的preferredStatusBarStyle方法,

vc中的preferredStatusBarStyley方法跟本不会被调用。


解决办法有两个:

方法一:

设置navbar的barStyle 属性会影响status bar 的字体和背景色。如下。

    //status bar的字体为白色

    //导航栏的背景色是黑色。

    self.navigationController.navigationBar.barStyle = UIBarStyleBlack;

    

    //status bar的字体为黑色

    //导航栏的背景色是白色,状态栏的背景色也是白色。

    //self.navigationController.navigationBar.barStyle = UIBarStyleDefault;


方法二:

自定义一个nav bar的子类,在这个子类中重写preferredStatusBarStyle方法:

MyNav* nav = [[MyNav alloc] initWithRootViewController:vc];

self.window.rootViewController = nav;


@implementation MyNav


- (UIStatusBarStyle)preferredStatusBarStyle

{

    UIViewController* topVC = self.topViewController;

    return [topVC preferredStatusBarStyle];

}





导航栏透明方法:
  UIImage *image = [UIImage imageNamed:@"clear"];
    [self.navigationController.navigationBar setBackgroundImage:image forBarMetrics:UIBarMetricsDefault];
    [self.navigationController.navigationBar setShadowImage:image];
    [self.navigationController.navigationBar setBackgroundImage:[UIImage new] forBarMetrics:UIBarMetricsDefault];//setBackgroundImage设置成功,不过会多出一条线白线,需要通过setShadowImage设置背景图片
    [self.navigationController.navigationBar setShadowImage:[UIImage new]];
导航栏有个属性不要设置:
self.navigationController.navigationBar.translucent = YES;//如果是NO得话表示导航栏不透明且占空间,其他坐标是从导航栏下开始计算的。
如果在UIViewController中,想让视图置顶需要:
 self.edgesForExtendedLayout = UIRectEdgeAll;//这个默认是UIRectEdgeNone 表示视图坐标的计算是从导航栏下开始的。
如果是UITableViewController 要在透明的navigationController 中置顶需要:
self.automaticallyAdjustsScrollViewInsets = NO;//专门针对scrollView的,表示自动计算scrollview 的contentview 中的位置,让其不被导航栏挡住。默认是YES


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值