iOS开发tips-UINavigationBar的切换效果

2020-01-21 02:25:41王冬梅

概述

在iOS系统中,如果控制器是以push方式进行管理的话,那么事实上多个控制器是共享的同一个导航栏。当然iOS系统的设计无可厚非,但是国内的应用经常会遇到很多个性的设计,就比如说A push到 B,A可能有导航栏,但是B控制器要求导航栏是透明的,这样一来A和B由于共用同一个导航栏就会让整个切换操作不易管理,何况从iOS 7开始不仅仅是点击返回按钮瞬间返回A那么简单,还要支持通过手势操作从B缓慢返回到A的导航栏渐变效果。本文就简单看一下如何能够更加合理的设计导航栏切换的效果以避免开发中由于导航栏管理不善而造成管理混乱的状况。

导航栏

在开始今天的话题之前,先看一下关于UINavigationBar的一些常见设计,要想清楚的了解导航栏的切换,弄清UINavigationBar的一些常用设置是必不可少的。简单起见,这里仅仅列出具体设置方式,不再一一赘述其细节:

barbuttonitem颜色设置:navigationBar.tintColor

这种方式包括push中的返回按钮,不过返回按钮可以通过自定义图片达到调整颜色效果navigationBar.backIndicatorImage及navigationBar.backIndicatorTransitionMaskImage。
此外,注意字体大小等则必须通过UIBarButtonItem的setTitleTextAttributes设置,或者干脆自定义customView

NavigationBar title颜色设置:navigationBar.titleTextAttributes

注意:如果个性的标题栏,例如背景图则可以直接设置navigationItem.titleView)

返回按钮移除标题:backBarButtonItem.setBackButtonTitlePositionAdjustment将标题移除屏幕外

导航栏颜色设置:navigationBar.barTintColor

注意:也可以使用navigationBar.setBackgroundImage方法指定一个不同颜色的图片修改导航栏背景色。

另外,navigationBar.barStyle是对于导航栏整体风格的设置,默认为default(白色背景、黑色文字、状态栏文字也是黑色),你可以设置成black(黑色背景、白色文字,状态栏文字也是白色)。也就是说它不仅影响到导航栏背景色和标题颜色等,也影响状态栏风格。不过当这个设置和上面的设置发生冲突时,会以上面的独立设置为准。

isTranslucent是另一个导航栏常用属性,从iOS 7开始加入,默认为true代表导航栏半透明。如果通过navigationBar.setBackgroundImage来修改导航栏背景色,导航isTranslucent=true时即使图片颜色不透明那么系统也会修改图片的alpha达到半透明效果(这种情况_UIBarBackground透明,修改图片alpha。但是这种半透明效果并非系统默认的毛玻璃效果,系统默认的的毛玻璃效果是iOS增加了UIVisualEffectView来实现的,而自定义背景之后则不会自动增加UIVisualEffectView);如果isTranslucent=false那么即使图片颜色透明,系统也会将其调整为不透明效果(这种情况是将_UIBarBackground设置为白色或黑色,具体依据barStyle确定)。但是如果是通过barTintColor修改背景色的话,即使isTranslucent=true也无法达到半透明效果。