`
473687880
  • 浏览: 535339 次
文章分类
社区版块
存档分类
最新评论

定制iOS 7中的导航栏和状态栏

 
阅读更多

近期,跟大多数开发者一样,我也正忙于对程序进行升级以适配iOS 7。最新的iOS 7外观上有大量的改动。从开发者的角度来看,导航栏和状态栏就发生了明显的变化。状态栏现在是半透明的了,这也就意味着导航栏会显示在状态栏后面。有些情况下,导航栏的背景图片可以延伸显示到状态栏后面。

之前我曾经写过一篇关于如何定制导航栏的文章。不过现在是时候对其进行更新了。下面就是本文将要介绍的内容:

iOS 7中默认的导航栏

设置导航栏的背景颜色

在导航栏中使用背景图片

定制返回按钮的颜色

修改导航栏标题的字体

修改导航栏标题为图片

添加多个按钮

修改状态栏的风格

隐藏状态栏

总结

本文提供的代码需要用Xcode 5来执行。如果你还在使用老版本的Xcode,那么在运行示例之前请将Xcode升级到Xcode 5。

iOS 7中默认的导航栏

在开始定制之前,我们先来看看iOS 7中默认导航栏的外观。通过Xcode用Single View Controller模板创建一个工程。然后将view controller嵌入到一个navigation controller中。如果你不想从头开始,那么也可以在这里下载到这个示例工程。Xcode 5包含有iOS 6和iOS 7模拟器,我们可以在这两个不同的模拟器版本中运行示例程序,进行对比,如下图所示:

如上图所示,在iOS 7中的导航栏默认情况下跟状态栏是交织在一起的,并且它的颜色也被修改为亮灰色。

设置导航栏的背景颜色

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

  1. [[UINavigationBarappearance]setBarTintColor:[UIColoryellowColor]];

效果如下图所示:

一般情况,我们都会使用自己的颜色,下面这个宏用来设置RGB颜色非常方便:

  1. #defineUIColorFromRGB(rgbValue)[UIColorcolorWithRed:((float)((rgbValue&0xFF0000)>>16))/255.0green:((float)((rgbValue&0xFF00)>>8))/255.0blue:((float)(rgbValue&0xFF))/255.0alpha:1.0]

将上面这个宏放到AppDelegate.m文件中,然后通过这个宏来创建一个UIColor对象(根据指定的RGB)。如下示例:

  1. [[UINavigationBarappearance]setBarTintColor:UIColorFromRGB(0x067AB5)];

默认情况下,导航栏的translucent属性为YES。另外,系统还会对所有的导航栏做模糊处理,这样可以让iOS 7中导航栏的颜色更加饱和。如下图,是translucent值为NO和YES的对比效果:

要想禁用translucent属性,可以在Storyboard中选中导航栏,然后在Attribute Inspectors中,取消translucent的勾选。

在导航栏中使用背景图片

如果希望在导航栏中使用一个图片当做背景,那么你需要提供一个稍微高一点的图片(这样可以延伸到导航栏背后)。导航栏的高度从44 points(88 pixels)变为了64 points(128 pixels)。我们依然可以使用setBackgroundImage:方法为导航栏设置自定义图片。如下代码所示:

  1. [[UINavigationBarappearance]setBackgroundImage:[UIImageimageNamed:@"nav_bg.png"]forBarMetrics:UIBarMetricsDefault];

示例工程中提供了两个背景图片:nav_bg.png 和 nav_bg_ios7.png。运行一下试试看吧,如下效果:

定制返回按钮的颜

在iOS 7中,所有的按钮都是无边框的。其中返回按钮会有一个V型箭头,以及上一个屏幕中的标题(如果上一屏幕的标题是空,那么就显示”返回”)。要想给返回按钮着色,可以使用tintColor属性。如下代码所示:

  1. [[UINavigationBarappearance]setTintColor:[UIColorwhiteColor]];

除了返回按钮,tintColor属性会影响到所有按钮标题和图片。

如果想要用自己的图片替换V型,可以设置图片的backIndicatorImage和backIndicatorTransitionMaskImage。如下代码所示:

  1. [[UINavigationBarappearance]setBackIndicatorImage:[UIImageimageNamed:@"back_btn.png"]];
  2. [[UINavigationBarappearance]setBackIndicatorTransitionMaskImage:[UIImageimageNamed:@"back_btn.png"]];

图片的颜色是由tintColor属性控制的。

修改导航栏标题的字体

跟iOS 6一样,我们可以使用导航栏的titleTextAttributes属性来定制导航栏的文字风格。在text attributes字典中使用如下一些key,可以指定字体、文字颜色、文字阴影色以及文字阴影偏移量:

UITextAttributeFont – 字体key

UITextAttributeTextColor – 文字颜色key

UITextAttributeTextShadowColor – 文字阴影色key

UITextAttributeTextShadowOffset – 文字阴影偏移量key

如下代码所示,对导航栏的标题风格做了修改:

  1. NSShadow*shadow=[[NSShadowalloc]init];
  2. shadow.shadowColor=[UIColorcolorWithRed:0.0green:0.0blue:0.0alpha:0.8];
  3. shadow.shadowOffset=CGSizeMake(0,1);
  4. [[UINavigationBarappearance]setTitleTextAttributes:[NSDictionarydictionaryWithObjectsAndKeys:
  5. [UIColorcolorWithRed:245.0/255.0green:245.0/255.0blue:245.0/255.0alpha:1.0],NSForegroundColorAttributeName,
  6. shadow,NSShadowAttributeName,
  7. [UIFontfontWithName:@"HelveticaNeue-CondensedBlack"size:21.0],NSFontAttributeName,nil]];

运行效果如下图所示:

修改导航栏标题为图片

如果要想将导航栏标题修改为一个图片或者logo,那么只需要使用下面这行代码即可:

  1. self.navigationItem.titleView=[[UIImageViewalloc]initWithImage:[UIImageimageNamed:@"appcoda-logo.png"]];

上面的代码简单的修改了titleView属性,将一个图片赋值给它。 注意:这不是iOS 7中的新功能,之前的iOS版本就可以已经有了。具体效果如下图所示:

添加多个按钮

同样,这个技巧也不是iOS 7的,开发者经常会在导航栏中添加多个按钮,所以我决定在这里进行介绍。我们可以在导航栏左边或者右边添加多个按钮。例如,我们希望在导航栏右边添加一个照相机和分享按钮,那只需要使用下面的代码即可:

  1. UIBarButtonItem*shareItem=[[UIBarButtonItemalloc]initWithBarButtonSystemItem:UIBarButtonSystemItemActiontarget:selfaction:nil];
  2. UIBarButtonItem*cameraItem=[[UIBarButtonItemalloc]initWithBarButtonSystemItem:UIBarButtonSystemItemCameratarget:selfaction:nil];
  3. NSArray*actionButtonItems=@[shareItem,cameraItem];
  4. self.navigationItem.rightBarButtonItems=actionButtonItems;

如下效果:

修改状态栏的风格

在老版本的iOS中,状态栏永远都是白色风格。而在iOS 7中,我们可以修改每个view controller中状态栏的外观。通过UIStatusBarStyle常量可以指定状态栏的内容是暗色或亮色。默认情况下,状态栏的显示是暗色。也就是说,状态栏上的时间、电池指示器和Wi-Fi信号显示为暗色。如果导航栏中使用暗色为背景,那么看起来的效果如下图所示:

如上图这种情况下,我们可能希望将导航栏的风格修改为亮色。这里有两个方法可以实现。在iOS 7中,我们可以在每个view controller中overridingpreferredStatusBarStyle:方法,如下所示:

  1. -(UIStatusBarStyle)preferredStatusBarStyle
  2. {
  3. returnUIStatusBarStyleLightContent;
  4. }

上面代码的效果如下图所示:

在iOS 7中,通过上面的方法来修改状态栏风格非常的棒。另外,我们也可以使用UIApplication的statusBarStyle方法来设置状态栏,不过,首先需要停止使用View controller-based status bar appearance。在project target的Info tab中,插入一个新的key,名字为View controller-based status bar appearance,并将其值设置为NO。

然后就可以使用下面的代码来设置状态栏风格了:

  1. [[UIApplicationsharedApplication]setStatusBarStyle:UIStatusBarStyleLightContent];

隐藏状态栏

有时候我们需要隐藏状态栏,那么此时我们在view controller中override方法prefersStatusBarHidden:即可,如下代码所示:

  1. -(BOOL)prefersStatusBarHidden
  2. {
  3. returnYES;
  4. }

总结

iOS 7给开发者提供了一些新的自由度来定制导航栏和状态栏的外观。希望上面的这些技巧能对你有用。这里可以下载到示例工程源码。只需要取消相关代码注释即可进行测试。

分享到:
评论

相关推荐

    IOS 自定义导航栏 和表格 学习笔记

    在iOS开发中,自定义导航栏(Navigation Bar)和表格(TableView)是两个非常重要的组件,它们被广泛用于构建各种用户界面。这篇学习笔记将深入探讨如何在iOS应用中实现自定义导航栏以及如何有效利用表格展示数据。 ...

    ios-滑动改变导航栏状态.zip

    本项目“ios-滑动改变导航栏状态.zip”主要展示了如何通过用户滑动屏幕来动态改变导航栏的状态,比如在下拉时放大导航栏中的图片,提供更丰富的交互体验。这个功能常见于新闻阅读、社交媒体等类型的App中,增加用户...

    ios-导航栏隐藏和显示.zip

    总结起来,"ios-导航栏隐藏和显示.zip"的示例涵盖了导航栏控制的核心技巧,包括导航栏的显示与隐藏逻辑、自定义手势识别、返回按钮的定制等,这些都是提升iOS应用用户体验的关键要素。开发者需要熟练掌握这些技术,...

    iOS自定义导航栏

    - 如果需要动态改变导航栏状态,如动画过渡,可以在`layoutSubviews()`或者`willTransition(to:)`等方法中处理。 4. **设置自定义导航栏**: 在需要使用自定义导航栏的`UIViewController`中,通过`...

    mPass iOS 定制导航栏(AUThemeManager).zip

    本文将详细解析如何使用Objective-C(OC)语言,通过AUThemeManager来定制mPass iOS应用的导航栏。 首先,我们需要了解`UINavigationController`的基本用法。它是iOS SDK提供的一种容器控制器,用于管理一个导航...

    Android-仿IOSQQ底部导航栏效果可自定义多种属性效果

    在iOS的设计中,QQ的底部导航栏有其独特的风格,如平滑的过渡动画和定制的图标样式。 在这个项目中,开发者可能实现了以下关键点: 1. **自定义视图**:为了达到仿iOS的效果,可能创建了一个自定义的View或者使用...

    iOS状态栏、导航栏的一些笔记分享

    在iOS开发中,状态栏和导航栏是用户界面的关键组成部分,它们提供了系统信息和应用程序导航。本文将深入探讨如何在iOS应用中管理这两个组件。 首先,状态栏显示重要的设备信息,如时间、电池状态和网络连接。在iOS...

    iOS 隐藏导航条和状态栏实现方法

    iOS 隐藏导航条和状态栏实现方法 状态栏的高度是20,导航栏的高度是44,如果同时存在状态栏的导航条,我们通常会设置view上的控件的位置的X 大于等于 64. 一:隐藏导航条:self.navigationController....

    ios-自定义导航栏标题切换效果.zip

    2. **监听视图控制器的生命周期**:在`viewWillAppear:`和`viewWillDisappear:`方法中,我们可以根据当前页面的状态更新导航栏标题,实现标题的动态变化。 3. **与ScrollView的联动**:如果Title切换效果与...

    ios-导航栏的平滑显示和隐藏.zip

    在iOS开发中,导航栏(UINavigationController)是应用界面中不可或缺的部分,用于展示层级结构和进行页面间的导航。平滑地显示和隐藏导航栏不仅能够提升用户体验,还能在某些场景下创造出更美观、流畅的视觉效果。...

    ios-自定义导航栏.zip

    下面我们将深入探讨自定义导航栏在iOS开发中的实现方法和相关知识点。 1. **UINavigationController**:这是iOS SDK中的一个类,负责管理一个堆栈式的视图控制器数组,并通过导航栏进行切换。默认的导航栏提供了...

    导航栏AND状态栏

    总的来说,"NavAndStatusDemo"这个项目覆盖了Android应用开发中关于状态栏和导航栏的重要定制技巧,包括颜色调整、显示隐藏、交互响应和动画效果。这些技术对于创建个性化、专业化的应用界面至关重要。开发者可以...

    iOS 自定义状态栏和导航栏详细介绍

    在iOS应用开发中,自定义状态栏和导航栏是常见的需求,以满足各种视觉效果和交互体验。本文将详细介绍如何在iOS中实现自定义状态栏和导航栏。 首先,我们来看如何自定义状态栏的字体颜色。iOS提供两种预设的状态栏...

    ios-侧滑返回导航栏颜色变化.zip

    在iOS开发中,用户界面的交互体验是至关重要的,尤其是导航栏(UINavigationController)的颜色变化。"ios-侧滑返回导航栏颜色变化"这个主题主要关注的是,当用户通过手势侧滑返回上一个视图控制器时,导航栏颜色...

    ios 自定义标题栏状态栏

    在iOS开发中,自定义标题栏(navigationBar)和状态栏(status bar)是常见的需求,尤其是在追求独特用户体验的App设计中。本篇文章将深入探讨如何在iOS应用中实现这一功能,主要围绕`UIKit`框架中的关键组件和方法...

    ios侧边导航栏

    在iOS应用开发中,侧边导航栏(通常称为抽屉式导航或Slide-out Navigation)是一种常见的设计模式,它允许用户通过从屏幕边缘滑动来访问附加的菜单选项或功能。这种设计常见于许多应用程序,尤其是那些具有复杂层级...

    ios-超简单!!! iOS设置状态栏、导航栏按钮、标题、颜色、透明度,偏移等.zip

    好评率100%,一行代码搞定导航栏颜色、透明度、标题、状态栏、偏移等,强烈推荐 oc和swift都有 github地址:https://github.com/wangrui460/WRNavigationBar 简书实现过程地址:...

    ios 导航栏放置多个按钮及引申的ivar变量的问题

    在iOS开发中,导航栏(NavigationBar)是应用界面中常见的一种元素,用于展示当前页面的标题以及提供导航功能。在标题右侧,我们通常会放置一个或者两个“返回”按钮,但有时需求可能会要求在导航栏上放置多个按钮,...

Global site tag (gtag.js) - Google Analytics