我们在开发的过程中用到的一些系统类,但是系统把所有的方法都隐藏起来了,不让调用,我们怎么获取这些方法并加以利用呢!请看下面的例子:
1、首先要获取这些类的一些方法,我现在拿QLPreviewController举例子,因为用到了它在展示PDF的时候,在横屏的时候导航栏已经隐藏掉了,它会调用自己的方法,又把它显示出来了,很是蛋疼!
Class currentClass=[QLPreviewController class];
while (currentClass) {
unsignedint methodCount;
Method *methodList =class_copyMethodList(currentClass, &methodCount);
for (int i =0; i < methodCount; i++) {
if ([currentClass isSubclassOfClass:[QLPreviewController class]]) {
NSLog(@"%@ - %@", [NSString stringWithCString:class_getName(currentClass)encoding:NSUTF8StringEncoding], [NSString stringWithCString:sel_getName(method_getName(methodList[i]))encoding:NSUTF8StringEncoding]);
}
}
free(methodList);
currentClass = class_getSuperclass(currentClass);
}
通过以上方法,可以获取QLPreviewController的隐藏方法,我这通过努力找到了,控制导航栏的那个方法:_canShowStatusBar
2、然后通过ios的黑魔法——Method Swizzling来改变这个方法的实现了,首先我们要创建一个QLPreviewController的Category,来覆盖系统方法,系统会优先调用Category中的代码,然后在调用原类中的代码!实现方法如下:
+ (void)load {
Method fromMethod =class_getInstanceMethod([self class],@selector(_canShowStatusBar));
Method toMethod =class_getInstanceMethod([self class],@selector(change));
method_exchangeImplementations(fromMethod, toMethod);
}
-(void)change {
[[UIApplication sharedApplication]setStatusBarHidden:YES];
}