RuntimePlayer-滑动隐藏UINavigationBar的坑

以后每用Runtime解决一个问题,就会记录在这个文集里。

我将以真实的使用场景为大家讲述Runtime的各种用法,让Runtime真正的投入到生产中。

合辑demo Github地址

问题描述

见过几种滑动隐藏UINavigationBar的方案,不管是KVO还是Runtime,最终的落点都是去改bar这个View。这个看起来简单的需求,真正做过的估计都知道,实际上还是有些坑的。

具体情况就是错位,莫名其妙的错位,总是在不经意间错位。由于具体的实现不同,错位的元素也不一样,有的是scrollView错位,有的是statusBar错位,琳琅满目,各有千秋。效果如下


大概是这么个样子

原因无外乎就是NavigationBar的frame被系统强制恢复到了初始位置,而相关元素没有正确响应这个事件。

我粗略的算了下,大概有这么几种情况会触发错位:NavigationBar初始化、modal&pop&push、app进入前台、开启热点或接到电话等。

也就是说解决这个错位问题的思路有两种,第一种,在上诉场景做相应的处理(比如手动把NavigationBar归位,贴吧的方案)。第二种,找到NavigationBar归位的原因,在这个地方直接处理。

本文要介绍第二种。

解决思路

通过给NavigationBar的setCenter:下断点,可以找到这么一个方法

-[UINavigationController _updateBarsForCurrentInterfaceOrientation]

这个方法会在所有NavigationBar可能需要更新的地方被调用。

知道了这个方法,问题就简化了很多,直接钩这个方法,根据上下文来做相应的处理。具体的处理代码,一般和页面布局以及实现有关,这里就不上代码了。

end

这种方式的优点是可以把判断逻辑集中,更加可靠,不会漏掉某种情况。缺点也有,这是个私有API,有的人不敢用。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 173,446评论 25 708
  • 面试题参考1 : 面试题[http://www.cocoachina.com/ios/20150803/12872...
    江河_ios阅读 1,758评论 0 4
  • 上周日晚21:00点在猫群里准点参加了海峰老师的成长心法分享课程。 课程开始前被海峰老师发在禁言群里的大红包给吓住...
    黄慧云yun阅读 213评论 0 0
  • 近期目标:孩子专注力提升,上课不讲话,及时完成课堂及家庭作业,做事不磨蹭,能有更多的时间做自己喜欢的事情! 孩子上...
    jessie娟子阅读 128评论 0 0
  • 起床:4:30 活动: 1、悦动50分:慢跑8.38公里+拉伸; 2、悦读50分: You can do it!
    云水禅心R阅读 171评论 0 3