您的位置:首页 > 移动开发 > IOS开发

一些关于iOS系统导航栏与自定义导航栏的事情

2016-08-10 13:13 357 查看
关于系统导航栏是真的让人又爱又恨,爱的是苹果本身对这个控件的封装已经是很完美了,包括内存、美化、渐变动画等等,一般来说,基本上所有需求都可以满足的。但是你要知道什么东西到了中国,就会发生翻天覆地的变化,例如后台的数据并发。在国内奇葩的产品设计之下,导航栏也是面目全非,反正我看了比较著名的APP,发现他们的导航栏基本都是自定义,其中牵扯最大的问题就是导航栏自身的隐藏、颜色渐变。

其实通过APP运行时,你可以看到系统NavigationBar的分层。一个navigationBar是分很多层的,并非我们看到的最外层,它里面有控制颜色的层,有放置控件的navigationItem层等等,有兴趣的可以通过xcode的Debug Navigator--->View UI Hierarchy,类似于Reveal这个工具。

系统的导航栏不多说,因为当你用到自定义导航栏时,基本上就是你们产品的需求,系统的导航栏已经满足不了,或者说满足起来极其麻烦。我前段时间也是遇到一个这样纠结的产品需求,首页导航栏隐藏,后面界面有些隐藏,有些不隐藏,这时为了防止Push/POP滑动动画时导航栏产生黑条,需要进行一系列的设置,极其麻烦。至于为什么会这样,在这解释下,因为当你设置了navigationController之后,在这个栈中是始终只存在一个navigationController的。同时,navigationBar也是始终只有一个,但是为什么每个界面的导航栏可以放置不同的控件呢?那是因为放置控件的navigationItem是每个界面都会初始化的,再次赞美下苹果工程师的机智,但这样就会导致一个问题,不同界面的生命周期会在ViewWillAppear和ViewWillDisappear中产生交汇,这时系统的navigationBar就会受到影响。这就是为什么你在设置不同控件时,系统navigationBar看起来是正常的,但是你一动navigationBar的透明度、颜色就会出来各种问题的原因。

基于上面那个原因,我自定义了navigationBar和navigationItem。刚开始,我将自定义的naviBar和naviItem放置在UINavigationController的category中,后来我发现因为系统的navigationController在一个栈中,是只初始化一次的,这导致每次Push之后的界面的naviBar将会覆盖上一个界面的,导致在返回以后无法再对上一个界面的naviBar进行操作,我想性系统可能是通过某种方式记录了,但我还不太清楚。所以我只能退而求其次将其放置在了UIViewController的category中,这样算是完美解决了这些问题。

今天重新看了下系统的层级结构,发现系统是将navigationbar加载到navigationController上了,所以我们可以效仿系统的做法。详情请看github源码

项目下载地址https://github.com/jizhidejingmo/YYNavigationBar
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: