FDFullscreenPopGesture和iOS14 相册授权冲突

最近在处理iOS14 的适配,项目使用了FDFullscreenPopGesture 处理全屏返回事件,库内部的方法交换后的fd_viewWillDisappear 中,因为处理setNavigationBarHidden 是在
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0 * NSEC_PER_SEC))
中进行的,所以当push 时

if (viewController && self.navigationController) {
            if (viewController.fd_prefersNavigationBarHidden) {
                [self.navigationController setNavigationBarHidden:YES animated:NO];
            }else {
                [self.navigationController setNavigationBarHidden:NO animated:NO];
            }
        }

操作的是上一个VC的navigationbar的显示和隐藏,而viewController 是即将显示的vc,这样使两个控制器navigationbar 的显示和隐藏保持一致,在pop 回来或者侧滑返回时,导航的显示更流畅。
但是在iOS14上,相册授权时,当你授权有限的照片权限时,会present 一个相册,UIImagePickerController内部一个PUPhotoPickerHostViewController,在向下滑动dismiss 掉UIImagePickerController时,因为UIImagePickerController 本身就是一个navigationController,没有navigationController,所以正常,但是当PUPhotoPickerHostViewController 消失的时候,它的navigationController 就是UIImagePickerController,而且!viewController.fd_prefersNavigationBarHidden == true,所以就会出现如下图,显示出导航UI的情况(导航栏显示出来了):


simulator_screenshot_11377FB3-0F9B-4BF3-A7B8-4583C51A97FB.png

解决方案:
1、如果你是自定义导航栏:大可不必实现viewWillDisappear 的交换方法,直接适配(笔者是此类情况)
2、如果你是用的系统导航栏:可能最快捷的是如果是PUPhotoPickerHostViewController 就return 掉,但是不排除自己实现一个vc,有一个类似PUPhotoPickerHostViewController 的孩子 ,被present 出来,这就有两种情况:1、自己记得给这个孩子设置fd_prefersNavigationBarHidden == true;2、假设从A控制器通过present的方式跳转到了B控制器,那么 A.presentedViewController 就是B控制器;B.presentingViewController 就是A控制器。所以:

if (self.presentingViewController) {
            return;
        }

把present 出来的子vc 都return 掉。

你可能感兴趣的:(FDFullscreenPopGesture和iOS14 相册授权冲突)