承接上文,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")]) {
}