http://www.jianshu.com/p/9f7f3fa624e7

http://cocoa.venj.me/blog/view-controller-based-status-bar-style-and-uinavigationcontroller/

http://www.jianshu.com/p/4196d7cf95f4

  • 状态栏的字体为黑色: UIStatusBarStyleDefault

  • 状态栏的字体为白色: UIStatusBarStyleLightContent

设置app的状态栏样式的使用使用了旧的方式,在info.plist里面设置了View controller-based status bar appearance为NO,默认为YES,一般式iOS6的时候使用这种方式,iOS7,8也兼容,但是到了iOS9就报了警告。

一. 在 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;

}

以前我们通过上面代码改变状态了颜色,iOS9以后点进去看api发现如下说明

// Setting the statusBarStyle does nothing if your application is using the default UIViewController-based status bar system.

@property(readwrite, nonatomic) UIStatusBarStyle statusBarStyle NS_DEPRECATED_IOS(2_0, 9_0, "Use -[UIViewController preferredStatusBarStyle]");

- (void)setStatusBarStyle:(UIStatusBarStyle)statusBarStyle animated:(BOOL)animated NS_DEPRECATED_IOS(2_0, 9_0, "Use -[UIViewController preferredStatusBarStyle]");

解决办法:

修改方式将View controller-based status bar appearance设置为YES,然后使用新的方式来实现状态栏的样式。

- (UIStatusBarStyle)preferredStatusBarStyle;

- (UIViewController *)childViewControllerForStatusBarStyle;

- (void)setNeedsStatusBarAppearanceUpdate

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方法:

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

self.window.rootViewController = nav;

@implementation Nav

- (UIStatusBarStyle)preferredStatusBarStyle

{

UIViewController* topVC = self.topViewController;

return [topVC preferredStatusBarStyle];

}
=======================
 

UINavigationController和View Controller-based状态栏风格

JUL 24TH, 2014 10:30 AM

从iOS 7开始, UIViewController有了一个新的方法:- preferredStatusBarStyle,可以让用户指定状态栏风格。但问题是这个方法只有在ViewController不包含在UINavigationController中时才起作用。大部分情况下,ViewController不会单独使用,一般都会嵌套在UINavigationController中的。因为不知道这一点,所以在很长一段时间内,我都很困惑,明明我已经在我的ViewController里写了- preferredStatusBarStyle, 却一点都不起作用。

知道了原因,接下来就简单了。我们可以写一个UINavigationController的扩展,覆盖其默认实现,返回最上面的ViewControllerpreferredStatusBarStyle

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//UINavigationController+StatusBar.h
#import <UIKit/UIKit.h> @interface UINavigationController (StatusBar)
- (UIStatusBarStyle)preferredStatusBarStyle;
@end //UINavigationController+StatusBar.m
#import "UINavigationController+StatusBar.h" @implementation UINavigationController (StatusBar)
- (UIStatusBarStyle)preferredStatusBarStyle {
return [[self topViewController] preferredStatusBarStyle];
}
@end

用Swift来写:

1
2
3
4
5
extension UINavigationController {
override public func preferredStatusBarStyle() -> UIStatusBarStyle {
return self.topViewController.preferredStatusBarStyle()
}
}

然后,在需要使用UINavigationController的时候,引入UINavigationController+StatusBar.h头文件就可以了。如果你用Swift,增加了extension就完成了。

补充:

要使用View Controller Based Status Bar Style,你可能需要在项目的的Info.plist里增加一条记录:“View controller-based status bar appearance”,并将其值设置成YES

参考来源:Being Objective…

示例代码(Swift):NavStatusStyle

(全文完)

设置app的状态栏样式的更多相关文章

  1. wap2app(二)-- 设置APP系统状态栏

    准备 工具:HBuilder 一.全屏设置,不显示系统状态栏 这里所说的系统状态栏就是包括了:信号.运营商.电量等信息手机屏幕最顶部信息. 全屏并非状态栏透明或变色,而是没有状态栏,也就是看不见电量. ...

  2. [BS-10] 统一设置app所有页面的“返回”按钮样式

    统一设置app所有页面的“返回”按钮样式 如果想统一设置app所有页面的“返回”按钮样式,首先自定义WZNavigationController类继承UINavigationController类,然 ...

  3. iOS设置状态栏样式

    iOS设置状态栏样式可以使用两种方式. 方式一: 直接在需要改变默认状态栏样式的控制器中实现一个方法(其他任何事情都不用做): // 返回状态栏的样式 - (UIStatusBarStyle)pref ...

  4. 配置Info.plist (设置状态栏样式、自定义定位时系统弹出的提示语、配置3DTouch应用快捷菜单)

    一.概述 iOS中很多功能需要配置Info.plist才能实现,如设置后台运行.支持打开的文件类型.自定义访问隐私内容时弹出的提示等.了解Info.plist中各字段及其含义,可以访问苹果开发网站相关 ...

  5. iphone 6plus 下app里的状态栏和界面会被放大的问题//以及设置APP闪屏页/APP图标流程

    //设置APP闪屏页/APP图标流程如下 2.6Plus界面显示变大以及APP图标变大是由于上面图片的AppIcon以及LaunchImage造成的,主要是由于找不到对应的3x图片,或者改3x图片尺寸 ...

  6. CASE函数 sql server——分组查询(方法和思想) ref和out 一般处理程序结合反射技术统一执行客户端请求 遍历查询结果集,update数据 HBuilder设置APP状态栏

    CASE函数   作用: 可以将查询结果集的某一列的字段值进行替换 它可以生成一个新列 相当于switch...case和 if..else 使用语法: case 表达式/字段 when 值 then ...

  7. 设置状态栏样式Demo

    达到的效果: 色有黑色变为了白色 //设置状态条的样式 - (UIStatusBarStyle)preferredStatusBarStyle { returnUIStatusBarStyleLigh ...

  8. 【mui webAPP】HBuilder创建的iOS平台设置沉浸式状态栏

    应用占用全屏区域,而系统状态栏需要预留出系统状态栏高度. HBuilder创建的应用默认不使用沉浸式状态栏样式,需要进行如下配置开启:打开应用的manifest.json文件,切换到代码视图,在plu ...

  9. Windows Phone 8初学者开发—第6部分:设置应用程序的样式

    原文 Windows Phone 8初学者开发—第6部分:设置应用程序的样式 Source Code: http://aka.ms/absbeginnerdevwp8  PDF Version: ht ...

随机推荐

  1. yum install 与 yum groupinstall 的区别

    原文:http://blog.51yip.com/linux/1171.html yum 提供二种安装软件的方式 1,yum install 它安装单个软件,以及这个软件的依赖关系 2,yum gro ...

  2. ThinkPHP 单字母函数整理

    TP所有单独的函数,除了两个用来生成项目的buildAppDir之类的,其余都在框架目录/Common/functions.php这个文件里. A函数(基本是Action的简写) A函数是用来实例化我 ...

  3. sql server 函数

    1.Fun_Split 分割字符串,形成返回表 CREATE FUNCTION [dbo].[Fun_Split] ( @Items VARCHAR(MAX), @SplitStr VARCHAR(M ...

  4. node.js的npm详解

    一.什么是npm呢 npm(Node Package Manager,node包管理器)是node的包管理器,他允许开发人员在node.js应用程序中创建,共享并重用模块.模块就是可以在不同的项目中重 ...

  5. QTP 参数化

    PS:方法内容是转的别人的,我们项目中只用到了方法三,主要用于将测试数据与业务分离,增强测试数据的可维护性. 方法一.DataTable方法 这是QTP提供的一种方法,也是最容易实现参数化的一种方式. ...

  6. 【转】Linux写时拷贝技术(copy-on-write)

    http://www.cnblogs.com/biyeymyhjob/archive/2012/07/20/2601655.html 源于网上资料 COW技术初窥: 在Linux程序中,fork()会 ...

  7. jquery easyUi 配置默认页码

    jquery easyUI用pagenation 属性如果修改其默认加载页面显示,配置该怎样写? 注意区分datagrid的pagenation分页的区别,代码如下. if ($.fn.paginat ...

  8. ffplay 中filter的使用

    添加字幕:ffplay -vf drawtext="fontfile=arial.ttf: text='Test Text': x=100: y=300: \ fontsize=48: fo ...

  9. 读取MySQL中的数据并显示在JSP上

    <%@ page language="java" import="java.sql.*,java.io.*,java.util.*,java.sql.SQLExce ...

  10. KETTLE、spoon使用

    ETL是Extract”.“ Transform” .“Load”三个单词的首字母缩写分别代表了抽取.转换.装载.是数据仓库中重要的一环.ETL是数据的抽取清洗转换加载的过程,是数据进入数据仓库进行大 ...