`

状态栏 导航栏

    博客分类:
  • ios
 
阅读更多

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. [[UINavigationBar appearance] setBarTintColor:[UIColor yellowColor]]; 

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

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

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

  1. [[UINavigationBar appearance] 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. [[UINavigationBar appearance] setBackgroundImage:[UIImage imageNamed:@ "nav_bg.png" ] forBarMetrics:UIBarMetricsDefault]; 

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

定制返回按钮的颜

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

  1. [[UINavigationBar appearance] setTintColor:[UIColor whiteColor]]; 

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

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

  1. [[UINavigationBar appearance] setBackIndicatorImage:[UIImage imageNamed:@ "back_btn.png" ]]; 
  2. [[UINavigationBar appearance] setBackIndicatorTransitionMaskImage:[UIImage imageNamed:@ "back_btn.png" ]]; 

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

修改导航栏标题的字体

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

UITextAttributeFont – 字体key

UITextAttributeTextColor – 文字颜色key

UITextAttributeTextShadowColor – 文字阴影色key

UITextAttributeTextShadowOffset – 文字阴影偏移量key

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

  1. NSShadow *shadow = [[NSShadow alloc] init]; 
  2.     shadow.shadowColor = [UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:0.8]; 
  3.     shadow.shadowOffset = CGSizeMake(0, 1); 
  4.     [[UINavigationBar appearance] setTitleTextAttributes: [NSDictionary dictionaryWithObjectsAndKeys: 
  5.                                                            [UIColor colorWithRed:245.0/255.0 green:245.0/255.0 blue:245.0/255.0 alpha:1.0], NSForegroundColorAttributeName, 
  6.                                                            shadow, NSShadowAttributeName, 
  7.                                                            [UIFont fontWithName:@ "HelveticaNeue-CondensedBlack"  size:21.0], NSFontAttributeName, nil]]; 

修改导航栏标题为图片

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

  1. self.navigationItem.titleView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@ "appcoda-logo.png" ]]; 

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

 

添加多个按钮

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

  1. UIBarButtonItem *shareItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAction target:self action:nil]; 
  2. UIBarButtonItem *cameraItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemCamera target:self action:nil]; 
  3.  
  4. NSArray *actionButtonItems = @[shareItem, cameraItem]; 
  5. self.navigationItem.rightBarButtonItems = actionButtonItems; 

修改状态栏的风格

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

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

  1. -(UIStatusBarStyle)preferredStatusBarStyle 
  2.      return  UIStatusBarStyleLightContent; 

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

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

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

  1. [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent]; 

隐藏状态栏

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

  1. - (BOOL)prefersStatusBarHidden 
  2.  
  3.  
  4.      return  YES; 
  5.  

总结

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

分享到:
评论

相关推荐

    比亚迪车机状态栏+导航栏全屏沉浸教程

    本教程将详细介绍如何实现比亚迪车机状态栏和导航栏的全屏沉浸效果,提升车机的视觉效果和操作体验。 首先,我们要理解“沉浸式”(Immersive Mode)的概念。在移动设备或车机系统中,全屏沉浸模式通常是指隐藏或...

    Android-Android屏幕适配之状态栏导航栏半透明全透明5.0以上去阴影方法多样

    在Android应用开发中,屏幕适配是一个至关重要的环节,尤其是对于状态栏和导航栏的处理。随着Android系统版本的更新,这些元素的显示效果和控制方式也在不断进化。本篇文章将详细探讨Android 5.0及以上版本如何实现...

    RK3568 Android11-动态控制状态栏、导航栏的显示和隐藏

    在Android系统中,状态栏和导航栏是用户界面的重要组成部分,它们提供了系统信息显示和应用程序间的导航功能。在某些应用场景下,比如全屏游戏或沉浸式视频观看时,开发者可能需要动态地控制这些元素的显示与隐藏,...

    导航栏AND状态栏

    在Android应用开发中,导航栏(Navigation Bar)和状态栏(Status Bar)是用户界面的重要组成部分,它们提供了关键的信息和操作入口。本示例项目"NavAndStatusDemo"旨在展示如何自定义和调整这两个组件,以提升应用...

    沉浸式状态栏,一款方便的设置状态栏和导航栏的各种效果的框架

    支持低版本(不支持变灰)重新设置状态栏导航栏的背景。支持 Activity 和 Fragment。同一个 Activity 或 Fragment 可以多次设置不同的效果。适配刘海屏、滴水屏、挖孔屏、全面屏。适配 miui、emui、funtouch 等 rom ...

    安卓状态栏导航栏沉浸式工具类

    通过设置全屏,设置状态栏透明来适配有DrawerLayout或ActionBar以及普通ViewGroup的布局

    swift-一行代码设置状态栏导航栏按钮标题颜色透明度移动等

    超简单!!! 一行代码设置状态栏、导航栏按钮、标题、颜色、透明度,移动等 WRNavigationBar which allows you to change NavigationBar's appearance dynamically

    Android内容覆盖透明状态栏下实现全屏模式下带状态栏的效果

    在Android 5.0(Lollipop)之前,状态栏通常是不可定制的,但在之后的版本中,Google引入了`透明状态栏`和`导航栏`的概念,允许开发者自定义这部分的外观。 在Android的样式(style)文件中,可以通过设置以下属性...

    android沉浸式状态栏、变色状态栏、透明状态栏、修改状态栏颜色及透明

    在Android开发中,沉浸式状态栏(Immersive Mode)是一种设计趋势,它允许应用程序的内容扩展到设备的状态栏和导航栏,提供更为沉浸式的用户体验。本文将深入探讨如何在Android 4.4(KitKat)及更高版本上实现沉浸式...

    设置沉浸式布局后,手机状态栏或导航栏出现白屏。

    在Android应用开发中,沉浸式布局(Immersive Mode)是一种流行的设计,它可以让应用程序全屏显示,隐藏状态栏和导航栏,以提供更沉浸式的用户体验。然而,有时候在实现这种布局时,可能会遇到问题,比如标题中提到...

    SystemUI状态栏和导航栏的讲解

    状态栏是手机屏幕顶部的一条区域,展示诸如时间、通知图标、系统图标(如信号强度和电池状态)等信息。在Android中,状态栏的布局主要由`CollapsedStatusBarFragment`负责。这个类在`StatusBar`的`makeStatusBarView...

    android 沉浸式状态栏

    在标题“android 沉浸式状态栏”中提到的Demo,正是展示了如何实现这一功能,而描述则进一步强调了该Demo不仅仅局限于修改状态栏颜色,而是包含了隐藏状态栏和导航栏,并且在用户手势交互时动态显示这些元素。...

    Delphi XE 沉浸式透明状态栏实现(带示例代码).rar

    在本文中,我们将深入探讨如何在Delphi XE中实现沉浸式透明状态栏,并提供一个基于10.2及以上版本的示例代码。沉浸式状态栏是移动应用设计中的一个流行趋势,它允许应用程序的内容延伸到状态栏下方,提供更无缝、更...

    Android-6.0广播方式动态显示、隐藏状态栏和导航栏

    1.通过广播方式动态显示、隐藏系统栏(状态栏和导航栏), 显示:android.intent.action.SYSTEM_BAR_SHOW, 隐藏:android.intent.action.SYSTEM_BAR_HIDE 2. 系统->设置->显示->系统栏显示,添加控制系统栏功能

    android修改状态栏背景颜色、字体颜色,隐藏状态栏,状态栏透明

    //透明导航栏 activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION); //设置布局填充到状态栏下 decorView.setFitsSystemWindows(true); } ``` 为了在状态栏透明后仍能...

    沉浸式状态栏(渐变透明)

    6. **注意导航栏**: 除了状态栏,有些设备还有底部的导航栏。同样,我们也可以使用类似的方法让导航栏变得透明或渐变。不过,处理导航栏需要注意系统默认行为,避免与系统自带的导航栏交互冲突。 总之,沉浸式状态...

    Android 4.4修改状态栏、导航栏颜色、透明度

    在Android系统中,状态栏和导航栏是用户界面的重要组成部分,它们显示了设备的状态信息以及应用程序的导航元素。从Android 4.4(KitKat)版本开始,谷歌引入了对状态栏和导航栏颜色及透明度的自定义支持,使得开发者...

    Unity显示Android手机状态栏

    本文将详细讲解如何在Unity中实现显示Android手机的状态栏,并探讨透明状态栏和Android系统的黑底状态栏设置。 首先,我们要了解Unity引擎本身并不直接支持对Android状态栏的操作,这需要借助于Java插件或者Unity的...

    android状态栏一体化,沉浸式状态栏,状态栏管理类

    2. **全屏模式**:Android提供了一种全屏模式,即`SYSTEM_UI_FLAG_FULLSCREEN`,隐藏状态栏和导航栏,实现完全沉浸的体验。但这样会完全隐藏状态栏,可能不适用于所有情况。 3. **旗标组合**:在Android 4.4(Kit...

Global site tag (gtag.js) - Google Analytics