【iOS开发】WKWebView调用系统相册问题(二)

承接上文,H5页面直接调用手机自带相册、拍照功能时App端开发人员无法获取跳转的系统相册及拍照界面,既然无法获取该控制器,就会导致很多问题,上次讲了iOS8及以下系统无法modal控制器的问题,本次将会讲述如何在获取不到控制器的情况下修改控制器的导航栏。
上文链接:【iOS开发】WKWebView调用系统相册问题(一)
我想对于使用过系统相册的人来说,如何修改导航栏样式并不陌生,可以继承之后重写,可以设置代理修改。但是这些统统不好使了,因为跳转出的控制器完全获取不到,只能用到接下来介绍的方法--黑魔法Swizzling,其实对runtime耳闻已久,平时在开发中很少用到,借此机会记录一下。具体原理是给UIViewControlle创建分类UIViewController+Swizzling ,hook到-viewWillAppear: 方法,在交换的自己重写的方法中改变导航栏的样式,代码如下:
1.自己实现的交换方法

- (void)swizzlingViewWillAppear:(BOOL)animated {
    [self swizzlingViewWillAppear:animated];

    if ([self isMemberOfClass:NSClassFromString(@"PUPhotoPickerHostViewController")] || [self isMemberOfClass:NSClassFromString(@"UIDocumentPickerViewController")]) {
        [self configureRongCloudNavigation];
    }
}

2.重写load方法交换我们所写的方法

+ (void)load {
    [super load];
    //原本的willAppear方法
    Method willAppearOriginal = class_getInstanceMethod([self class], @selector(viewWillAppear:));
    //用于交换的willAppear方法
    Method willAppearNew = class_getInstanceMethod([self class], @selector(swizzlingViewWillAppear:));
    //交换
    if (!class_addMethod([self class], @selector(viewWillAppear:), method_getImplementation(willAppearNew), method_getTypeEncoding(willAppearNew))) {
        method_exchangeImplementations(willAppearOriginal, willAppearNew);
    }
    
}

3.在- (void)configureRongCloudNavigation中设置导航栏样式

    //点击系统相册弹出的控制器
    if ([self isMemberOfClass:NSClassFromString(@"PUPhotoPickerHostViewController")]) {
    }
    
    //点击浏览弹出的控制器
    if ([self isMemberOfClass:NSClassFromString(@"UIDocumentPickerViewController")]) {
    }

你可能感兴趣的:(【iOS开发】WKWebView调用系统相册问题(二))