iOS7之后两者合为一体,共用同一个背景色,导航栏紧跟着状态栏布局,也就是导航栏从y=20开始布局.今天遇到奇怪的问题,就是导航栏直接从屏幕顶端开始布局,也就是导航栏和状态栏重合在一起了.
看图:
造成这样问题的情景是,我有一个父ViewController,假设为A,里面有一个子ViewController,假设为B. B本身自带一个导航控制器.
我有一个操作,类似手机QQ主界面导航栏左边按钮的功能,就是缩小B,从左边推出菜单栏,然后点击菜单栏,push到一个新的页面然后返回,回来之后,并且回来的时候把B的导航栏重新添加了一次,B的导航栏就变成上图那样了.
因为这个时候B是缩小的,它本身接触不到状态栏,我猜测系统会认为对B来说状态栏是隐藏的,所以就把B的导航栏上移,直接从主view的顶部开始布局.注意,这里是通过隐藏导航栏又添加把导航栏刷新了一下.否则会保持原样.
最后,修改措施是保证B不会再被缩小的情况下刷新navigationBar,也可能是在和statusBar没有接触的情况下.具体的文档或者官方解释没有找到,不知道有人知道确切的原理,上面都只是观察而已.
这个问题深究一下是设计上的尴尬.UIViewController定位为UIView的控制器,UIView是任意大小的东西,从这个角度来说UIViewController是不受大小的约束,或说和大小这个因素是不能够依赖的.但是像statusBar的样式 是否显示,还有横竖屏的旋转却又依赖于UIViewController的方法.
如果一个界面里有多个UIViewController,从人的心理解读触发,我们会认为铺满这个屏幕的这个界面是主UIViewController,但实际UIViewController不是根据大小或者说根据屏幕的关系来处理主次的.或许应该有个标识来制定谁(哪个UIViewController)来负责当前的状态栏\横竖屏\导航栏之类的全局性质的东西的处理.或者状态栏这种和整个app是同一个层面的东西,不应该是viewController来控制,而是任何地方都可以控制,比如做成UIApplication的一个属性,我想让它显示就显示,怎么显示就怎么显示.
或者,就应该存在类似于游戏里场景(scene)的概念,就是我们平常理解的一个界面.应该有这么一个类,它就是我们当前看到的一切,然后它里面有很多的viewController.由他来控制我们看到的唯一的那些东西.比如横竖屏,因为viewController有多个,而横屏还是竖屏只会有一个,在级别上它们是不对称的.