问题背景
构建了一个APP,因为导航栏样式全部统一,就为UIViewController写了一个分类,在所有的控制器中都引用这个分类,在分类中,动态的定义了一个变量,用Method Swizzling替换viewWillAppear方法指向我们的方法,在这里给VC们都统一按规则设置了状态栏和导航栏的样式。
问题出现
于是有一天,产品经理提了一个需求,需要拍照上传一个东西,很顺手就来了一个UIImagePickerController
设好了autoNavigationBarHidden,字面意思,写的功能也就是自动隐藏导航栏,但是实际效果仍然是导航栏出现,看不见背后的闪光灯开关。
问题分析
这会是什么原因呢,难道是之前设置的无效了还是顶上覆盖的这层不是导航栏呢。不管怎样,先看看界面层级具体是个什么情况
看了一眼层级,哦,原来不仅仅是UIImagePickerController,这个上面还覆盖着CAMViewfinderViewController,CAMPreviewViewController好几个VC,他们具体是什么呢?在钩子函数中打印一下看看吧
问题解决
知道了这些VC的类名,只需要在钩子函数里根据类名判断一下,以后取照片就再也不会看到有导航栏的出现了。
问题延伸
问题比较简单,还好是使用了runtime的特性,为所有子VC都执行了方法,也很准确的发现了剩余的这些VC,如果仅仅是去设置UIImagePickerController的navigationBarHidden属性的话,可真是一时半会发现不了这个问题了,这里也是mark一下,这次的解决也是一种思路。