ios7状态栏以及导航栏

来源:互联网 发布:艾灸淘宝推广文章 编辑:程序博客网 时间:2024/06/03 19:23

本文来自 Toothpick's blog

ios7的发布使得ios的导航栏和状态栏一体化,渐渐适应以后还是蛮好看的。但是作为开发者,接下来新SDK编译的适配工作也会显得蛋疼不已。许多应用如微信等,可能还是只是适配布局,未进行较大的UI改动,或是出于谨慎考虑。设计风格的大改,怕是不可避免的。本公司的射鸡师早已酝酿出了一套界面,咋一看还真是漂亮极了。导航栏一会绿色一会白色,状态栏字体也是一会黑色一会白色,所以射鸡师它真的不痛程序猿的痛好吗!?


ok,这个适配工作真是有些许麻烦,既要保证完美适配,也不想搞乱项目。来吧。


设置导航栏的背景颜色
在iOS 7中,不再使用tintColor属性来设置导航栏的颜色,而是使用barTintColor属性来修改背景色。我们可以在AppDelegate.m文件中的方法didFinishLaunchingWithOptions:里面添加如下代码来修改颜色:

[[UINavigationBar appearance] setBarTintColor:[UIColor yellowColor]];

默认情况下,导航栏的translucent属性为YES。另外,系统还会对所有的导航栏做模糊处理,这样可以让iOS 7中导航栏的颜色会变得淡了。至于这个的解决方案可以参考:

如何在iOS 7中设置barTintColor实现类似网易和 Facebook 的 navigationBar 效果

http://www.cocoachina.com/applenews/devnews/2013/1024/7233.html


修改状态栏风格

在老版本的iOS中,状态栏永远都是白色风格。而在iOS 7中,我们可以修改每个view controller中状态栏的外观。通过UIStatusBarStyle常量可以指定状态栏的内容是暗色或亮色。默认情况下,状态栏的显示是暗色,状态栏上的时间、电池指示器和Wi-Fi信号显示为暗色,通常搭配浅色的背景。相反的,深色的背景时需要转为亮色的状态栏搭配。


在iOS 7中,我们可以在每个view controller中overridingpreferredStatusBarStyle:方法,如下所示:

-(UIStatusBarStyle)preferredStatusBarStyle
{
return UIStatusBarStyleLightContent;
}

另外,我们也可以使用UIApplication的statusBarStyle方法来设置状态栏,不过,首先需要停止使用View controller-based status bar appearance。在project target的Info tab中,插入一个新的key,名字为View controller-based status bar appearance,并将其值设置为YES,动态改变状态栏。


适配工作

NO.1

了解了修改的方法以后,接下来是如何简单方便的适配整个项目了。

对于原先使用官方类UINavigationController,可以添加一个扩展类UIViewController+NavigationBar,使用公共方法来设置导航栏



- (void)setBarColor:(UIColor)color
{
if (isIOS7)
{
[self.navigationController.navigationBar setBarStyle:UIBarStyleDefault];
[self.navigationController.navigationBar setBarTintColor:color];
}
else
{
[self.navigationController.navigationBar setBarStyle:UIBarStyleBlack];
[self.navigationController.navigationBar setTintColor:color];
}

}

如果,有需要再自定义UINavigationBar为MyUINavigationBar,和UINavigationController为MyUINavigationController

MyUINavigationBar:


- (void)setBarTintColor:(UIColor
)barTintColor {
//自定义
}

- (void)setTintColor:(UIColor )tintColor
{
//自定义
}


MyUINavigationController


- (id)init {
self = [super initWithNavigationBarClass:[MyUINavigationBar class] toolbarClass:nil];
return self;
}

- (id)initWithRootViewController:(UIViewController
)rootViewController {
self = [super initWithNavigationBarClass:[MyUINavigationBar class] toolbarClass:nil];
if(self) {
self.viewControllers = @[rootViewController];
};

return self;
}


NO.2


状态栏也需要因应导航栏的变化而变化,创建扩展类UIViewController+StatusBarStyle

UIViewController+StatusBarStyle.h:



@interface StatusBarStyle : NSObject

+ (UIStatusBarStyle)statusBarStyle;
+ (BOOL)statusBarHidden;

@end

@interface UIViewController (StatusBarStyle)

- (void)setStatusBarStyle:(UIStatusBarStyle)style;
- (void)setStatusBarHidden:(BOOL)isHidden;
@end


 
UIViewController+StatusBarStyle.m:



@implementation StatusBarStyle

static UIStatusBarStyle statusBarStyle = UIStatusBarStyleDefault;
static bool isBarHidden = NO;
static UIViewController *viewControllerv = nil;

+ (UIStatusBarStyle)statusBarStyle
{
return statusBarStyle;
}

+ (BOOL)statusBarHidden
{
return isBarHidden;
}

@end

@implementation UIViewController (StatusBarStyle)

- (void)setStatusBarStyle:(UIStatusBarStyle)style
{
if (isIOS7) {
statusBarStyle = style;
[viewControllerv setNeedsStatusBarAppearanceUpdate];
}
}

- (void)setStatusBarHidden:(BOOL)isHidden
{
if (isIOS7) {
isBarHidden = isHidden;
[viewControllerv setNeedsStatusBarAppearanceUpdate];
}
}

#ifdef __IPHONE_7_0

- (UIStatusBarStyle)preferredStatusBarStyle
{
viewControllerv = nil;
viewControllerv = self;
return [StatusBarStyle statusBarStyle];
}

- (UIStatusBarAnimation)preferredStatusBarUpdateAnimation
{
return UIStatusBarAnimationFade;
}

- (BOOL)prefersStatusBarHidden
{
return [StatusBarStyle statusBarHidden];
}
#endif
@end
0 0
原创粉丝点击