以后每用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,有的人不敢用。