承接上文咕娄,H5頁面直接調(diào)用手機自帶相冊拘鞋、拍照功能時App端開發(fā)人員無法獲取跳轉(zhuǎn)的系統(tǒng)相冊及拍照界面,既然無法獲取該控制器射富,就會導(dǎo)致很多問題膝迎,上次講了iOS8及以下系統(tǒng)無法modal控制器的問題,本次將會講述如何在獲取不到控制器的情況下修改控制器的導(dǎo)航欄胰耗。
上文鏈接:【iOS開發(fā)】WKWebView調(diào)用系統(tǒng)相冊問題(一)
我想對于使用過系統(tǒng)相冊的人來說限次,如何修改導(dǎo)航欄樣式并不陌生,可以繼承之后重寫柴灯,可以設(shè)置代理修改卖漫。但是這些統(tǒng)統(tǒng)不好使了,因為跳轉(zhuǎn)出的控制器完全獲取不到赠群,只能用到接下來介紹的方法--黑魔法Swizzling羊始,其實對runtime耳聞已久,平時在開發(fā)中很少用到查描,借此機會記錄一下店枣。具體原理是給UIViewControlle創(chuàng)建分類UIViewController+Swizzling 速警,hook到-viewWillAppear: 方法叹誉,在交換的自己重寫的方法中改變導(dǎo)航欄的樣式鸯两,代碼如下:
1.自己實現(xiàn)的交換方法
- (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中設(shè)置導(dǎo)航欄樣式
//點擊系統(tǒng)相冊彈出的控制器
if ([self isMemberOfClass:NSClassFromString(@"PUPhotoPickerHostViewController")]) {
}
//點擊瀏覽彈出的控制器
if ([self isMemberOfClass:NSClassFromString(@"UIDocumentPickerViewController")]) {
}