iOS 导航栏(UINavigationBar)和状态栏(statusBar)重合的问题

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有多个,而横屏还是竖屏只会有一个,在级别上它们是不对称的.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 16,523评论 4 61
  • 卫宣公属于比较能作的那种,做公子时诱奸其父卫庄公妾夷姜生子伋,当了国君后又强占伋妻,为另立新储害死了两个儿...
    沙漠里的小孩阅读 2,329评论 0 0
  • 女人与珠宝总是相得益彰的。只有女人才能更好的诠释出珠宝的美,也只有珠宝才能更好的衬托出女人的美。女为悦己者容,似乎...
    艺千画室阅读 438评论 1 5
  • “Shortest answer is doing 最简单的回答就是做”
    Z嘉莉LLLL阅读 294评论 0 1
  • 25.为什么自己做的菜吃起来更香 “ 非我发明症侯群”会使人陷入自己的想法中,包括解决方案,经营理念和发明创造...
    季玫阅读 178评论 0 0

友情链接更多精彩内容