底部标签选择栏,顶部导航栏用系统的,还是自定义?在实践过程中,经常有这样的纠结。
原因分析
- 标签栏和导航栏跟一般视图不一样,他们属于两个容器控制器的一部分,是这两个容器控制器的可见部分。
- 标签栏和导航栏是全局的,整个应用就一个,在某处的改动很可能在其他场景出现意料之外的结果
- 标签栏和导航栏处于最顶层,跟其他视图不在一个层面
- 标签栏和导航栏尺寸,布局等往往有特殊的约定。比如系统兼容,等比例放大等概念就不大合适用来描述他们
- 有些时候,往往出现在开发者看来比较奇葩的需求。比如标签栏的图标要动,内容区域的视图延伸到导航栏。导航栏随着表格的滑动淡入淡出的动效。等等不一而足。专业而负责的回答是让提这些意见的人去看看苹果的界面设计指导
系统的
- 目前用系统的还是占大多数,苹果提供的系统组件已经足够优秀
- 全局的,样式只要设置一次就好了
- 标签栏只要提供黑白的icon就可以了,自带渐变效果
- 有些API的设计比较独特,和预期相差较大,需要针对性多尝试
- 已经能够覆盖日常绝大部分的需求
- 限制还是比较明显的,那些“特殊的奇葩的”需求很难满足
自定义的
- 对那些“特殊的奇葩的”需求能灵活应对
- API可以取个自己看着舒服的名字
- 能开发者能力相关,给出的API在其他开发者开来不一定比系统的好用
- 不通用,成果在其他地方用不上
- 用视图模拟的话,是局部的,每个页面都要搞一遍,比较繁琐
- 继承系统类自定义的话,受限制明显,对那些“特殊的奇葩的”需求就显得力不从心
- 有些系统的功能就比较难实现,比如左滑后退、中间的动效等等
选择建议
- 尽量用系统的标签栏和导航栏,功能已经非常强大,也是目前的主流选择
- 必要的时候可以考虑集成系统的类进行一些自定义,不过只推荐一级继承。
- 对那些“特殊的奇葩的”需求,就隐藏系统的标签栏和导航栏,就当做一个普通的视图来做,一般这种页面是高度自定义的,不会太多
- 隐藏或者显示系统的标签栏或者导航栏,会影响其他的页面。这里有两种处理方式:一种是增加一个属性记录状态,离开页面之后恢复。另一种是让受影响的页面自行设置。这两种方法都可以,只要大家约定好就行。