iOS 导航栏的控制

颜色

导航条的属性 translucent 可以控制导航条是否是透明的, 默认是YES,也就是透明的。打开时透过导航条可以模糊的看到ViewController或是Window的背景图案。这里我们分为两种情况来讨论背景颜色的设置

在关闭translucent的情况下
可以通过 barTintColor 来设置导航条的背景色
当然也可以通过 setBackgroundImage 来设置背景
但是backgroundImage的图层更靠上一些,也就是说如果两个都设置的话,显示的是backgroundImage的图片,不过如果你的图片如果有透明的话,也会透出barTintColor的颜色

如果backgroundImage设置为纯透明色,tintColor也设置为纯透明色的话,这个时候导航条是黑色的,这个时候不能透出window的背景色或是viewController的颜色,并且,此时设置bar的backgroundColor 是没有用的

在开启 translucent 的情况下
几乎一样,不过是在两个图层下面又可以透出Window或是viewController的背景色
如果backgroundImage设置为纯透明色,tintColor也设置为纯透明色的话,此时设置bar的backgroundColor 只会改变导航条的颜色,状态栏则会透视下去,显示的是viewController或是window的背景颜色

设置分割线的颜色需要使用 shadowImage 属性,你可以赋予一张图片,但是这个图片只有在导航条背景使用 setBackgrounImage 设置的时候才能默认启用,否则是没有用的

这里你可以这样认为, backgroundImage在第一层, barTintColor在第二层,translucent是第三层(YES的时候是模糊透明,NO的时候是黑色不透明的), backgroundColor是第四层(但是只能显示bar的44点高度的颜色,不能影响到status的颜色),通过层级,你就可以自由的控制你想要的效果了。

显示和隐藏

导航条的隐藏和显示可以通过navigationBar.hidden控制

statusBar 显示和隐藏

如果 View controller-based status bar appearance 为 NO, 我们就只能使用全局控制。就是使用 UIApplication.sharedApplication.statusBarHidden
来控制,但是这里苹果已经不推荐了,因为一个地方的改动会影响整个应用

  • 没用使用导航管理控制器时
    通过重写方法-(BOOL)prefersStatusBarHidden来实现隐藏和显示statusBar
    通过重写方法- (UIStatusBarAnimation)preferredStatusBarUpdateAnimation 来控制状态栏显示动画
    通过重写方法- (UIStatusBarAnimation)preferredStatusBarStyle 来控制状态栏样式

  • 使用导航来管理控制器时
    这个时候以上各个属性并不会被调用,我们需要实现一个导航控制器的子类,然后在实现中覆写方法
    -(UIViewController )childViewControllerForStatusBarHidden
    - (UIViewController )childViewControllerForStatusBarStyle
    通过它返回你要控制的控制器就ok了,一般是返回
    self.topViewController**

可能遇见的问题

重写的方法不执行(实现了导航控制器子类后还是不执行)
如果你从vcA使用present的方式跳转到vcB,并且使用自定义动画(UIViewControllerAnimatedTransitioning),上述方法也是不会执行的。解决方法是在vcB初始化的时候把 modalPresentationCapturesStatusBarAppearance设为 true。这个属性决定vcB在非全屏模式下被present时,是否接管statusBar外观的控制权,默认为NO。因为自定义动画属于非全屏的跳转,所以跳转以后的vc并没有获得statusBar外观的控制权,上面的方法就失效了,

push的时候导航条会黑一下
一般是你实现一个导航控制器的子类,并用它push控制器的时候发生,可能是因为转场动画containerView的背景色的问题,你可以在导航控制器中设置自己的背景色是白色,就ok了

class ViewController: UIViewController {
var isHidden:Bool = false
@IBAction func clicked(sender: AnyObject) {
isHidden = !isHidden
UIView.animateWithDuration(0.5) { () -> Void in
self.setNeedsStatusBarAppearanceUpdate()
}
}
override func preferredStatusBarUpdateAnimation() -> UIStatusBarAnimation {
return UIStatusBarAnimation.Slide
}
override func prefersStatusBarHidden() -> Bool {
return isHidden
}
}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 151,688评论 1 330
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 64,559评论 1 273
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 101,749评论 0 226
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 42,581评论 0 191
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 50,741评论 3 271
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 39,684评论 1 192
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,122评论 2 292
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 29,847评论 0 182
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 33,441评论 0 228
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 29,939评论 2 232
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,333评论 1 242
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 27,783评论 2 236
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,275评论 3 220
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 25,830评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,444评论 0 180
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 34,553评论 2 249
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 34,618评论 2 249

推荐阅读更多精彩内容

  • 最近项目里有个需求和导航栏的样式定制有关,深入之后发现之前理解的一些概念有些模糊,刚好趁着这次机会全面整理了一下。...
    Kevin追梦先生阅读 481评论 0 0
  • 最近项目里有个需求和导航栏的样式定制有关,深入之后发现之前理解的一些概念有些模糊,刚好趁着这次机会全面整理了一下。...
    hi_xgb阅读 4,963评论 4 39
  • 军训他找个借口逃掉了。
    何青猊阅读 124评论 0 0
  • 感冒发烧,头疼脑热是非常常见的一种疾病,几乎没有人没得过感冒,有些体质不好的人甚至一年要感冒几次,再加上感冒不会引...
    青叶11阅读 2,026评论 15 23
  • 当已经苍颜白发的自己重新审视事物之际,却没有了当年的那份状态;而此时的面容已然暗淡,这是时间微微一晃而留下的唯...
    在世界中心说阅读 420评论 0 1