一些关于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
其实通过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
相关文章推荐
- 关于iOS系统里录音的一些设置的心得
- iOS开发中关于导航栏的一些设置
- 关于金融系统的一些事情
- IOS关于SELF点的一些事情
- iOS开发 ☞ 关于带系统导航栏坐标的问题
- 关于《ASP.NET办公自动化系统开发实例导航》问题的一些总结
- 关于《谋划》一些事情
- 关于最近的我和红红的一些事情
- 关于编写高可靠性的软件(系统)的一些思考
- 关于2005年的一些事情的记忆
- [ZZ]关于工作的一些事情
- 关于《ASP.NET办公自动化系统开发实例导航》问题的一些总结
- 关于我的一些事情
- 刚刚写了一些关于找工作的事情,突然间有BUG。
- 关于系统版本判断的一些知识
- 关于系统性能优化的一些操作和泛型的应用(第二天)
- 关于面向对象,系统和程序线程的一些想法
- 关于系统时间的一些操作
- GeoGraphics文档中关于坐标系统的一些知识
- Agile系统一些关于通知的表及关系