本文来自 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 效果
修改状态栏风格
在老版本的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