QLPreviewController的使用
来源:互联网 发布:淘宝卖家封号 编辑:程序博客网 时间:2024/06/03 22:49
QLPreviewController是<QuickLook/QuickLook.h>框架中的一个重要视图控制器,主要用于查看PDF、word文档、图片等。但是对于纯文本的TXT文档不适用。
QLPreviewController的使用方法这里不再赘述,网上挺多。但是有时候
QLPreviewController并不适合我们在工程中直接使用,他自带的导航栏我就不喜欢,那么我们就需要自己定制导航栏。但是在Apple提供的框架中并没有提供导航栏的自定制功能,想必小伙伴和我遇到了同样的困惑。
重点开始,目前我发现了两种比较靠谱的自定制的方法,现在分享给大家:
第一:
通过运行时,手动的添加Swizzing方法,交换系统原有的功能实现。在这个过程中你会发现,done按钮和分享按钮会被系统自动添加到setItems的数组中去,所以在(setRightBarButtonItems:animated:)方法中你设置一个按钮,实际上参数传过去两个按钮,这也就是为什么始终存在done和分享按钮的原因。
原因已经找出来了,那么现在我们就通过运行时交换成我们的实现就可以了。
- (void)override_setRightBarButtonItem:(UIBarButtonItem *)item animated:(BOOL)animated{ if (item && [item.target isKindOfClass:[QLPreviewController class]] && item.action == @selector(actionButtonTapped:)){ QLPreviewController *previewController = (QLPreviewController *)item.target; [self override_setRightBarButtonItem:previewController.navigationItem.rightBarButtonItem animated:animated]; } else { [self override_setRightBarButtonItem:item animated:animated]; }}- (void)override_setRightBarButtonItems:(NSArray *)items animated:(BOOL)animated{ if ([items count] == 0) { return; } else { UIBarButtonItem *firstItem = [items objectAtIndex:0]; BOOL override = NO; if (firstItem && [firstItem.target isKindOfClass:[QLPreviewController class]] && firstItem.action == @selector(actionButtonTapped:)) { override = YES; } if (override) { QLPreviewController *previewController = (QLPreviewController *)firstItem.target; [self override_setRightBarButtonItems:previewController.navigationItem.rightBarButtonItems animated:animated]; } else { [self override_setRightBarButtonItems:items animated:animated]; } }}- (void)override_setLeftBarButtonItem:(UIBarButtonItem *)item animated:(BOOL)animated{ if (item && [item.target isKindOfClass:[QLPreviewController class]] && item.action == @selector(doneButtonTapped:)){ QLPreviewController *previewController = (QLPreviewController *)item.target; [self override_setLeftBarButtonItem:previewController.navigationItem.leftBarButtonItem animated:animated]; } else { [self override_setLeftBarButtonItem:item animated:animated]; }}- (void)override_setLeftBarButtonItems:(NSArray *)items animated:(BOOL)animated{ if ([items count] == 0) { return; } else { UIBarButtonItem *firstItem = [items objectAtIndex:0]; BOOL override = NO; if (firstItem && [firstItem.target isKindOfClass:[QLPreviewController class]] && firstItem.action == @selector(doneButtonTapped:)) { override = YES; } if (override) { QLPreviewController *previewController = (QLPreviewController *)firstItem.target; previewController.navigationController.navigationBar.backgroundColor = [UIColor blackColor]; [self override_setLeftBarButtonItems:previewController.navigationItem.leftBarButtonItems animated:animated]; } else { [self override_setLeftBarButtonItems:items animated:animated]; } }}void MethodSwizzle(Class class, SEL originalSEL, SEL overrideSEL){ Method originalMethod = class_getInstanceMethod(class, originalSEL); Method overrideMethod = class_getInstanceMethod(class, overrideSEL); if (class_addMethod(class, originalSEL, method_getImplementation(overrideMethod), method_getTypeEncoding(overrideMethod))) { class_replaceMethod(class, overrideSEL, method_getImplementation(originalMethod), method_getTypeEncoding(originalMethod)); } else { method_exchangeImplementations(originalMethod, overrideMethod); }}+ (void)exchangeMethod{ MethodSwizzle(self, @selector(setRightBarButtonItem:animated:), @selector(override_setRightBarButtonItem:animated:)); MethodSwizzle(self, @selector(setRightBarButtonItems:animated:), @selector(override_setRightBarButtonItems:animated:)); MethodSwizzle(self, @selector(setLeftBarButtonItem:animated:), @selector(override_setLeftBarButtonItem:animated:)); MethodSwizzle(self, @selector(setLeftBarButtonItems:animated:), @selector(override_setLeftBarButtonItems:animated:));}+ (void)noExchangeMethod{ MethodSwizzle(self, @selector(override_setRightBarButtonItem:animated:), @selector(setRightBarButtonItem:animated:)); MethodSwizzle(self, @selector(override_setRightBarButtonItems:animated:), @selector(setRightBarButtonItems:animated:)); MethodSwizzle(self, @selector(override_setLeftBarButtonItem:animated:), @selector(setLeftBarButtonItem:animated:)); MethodSwizzle(self, @selector(override_setLeftBarButtonItems:animated:), @selector(setLeftBarButtonItems:animated:));}我们只需要,在加载前调用exchangeMethod方法即可,当页面退出,我们再将该方法交换回来就可以了。
第二种方法:
这种方法非常便捷,但是不建议使用。
直接将QLPreviewController的实例的视图当成子试图放入到另外一个控制器中。这样导航栏可以做到完全自定义。功能上没有影响。
0 0
- QLPreviewController的使用
- QLPreviewController 的使用
- QLPreviewController的使用
- 使用QLPreviewController打开PDF
- QLPreviewController的各种显示
- QLPreViewController的初步实用
- QLPreviewController
- IOS QLPreviewController的简单使用及如何隐藏toolbar上的Action按钮
- (浏览文档)UIDocumentInteractionController打开自己的第三方应用、使用QLPreviewController浏览文档
- iOS指南系列:使用QLPreviewController浏览文档
- iOS中使用QLPreviewController来预览文件
- 如何隐藏 QLPreviewController 的 Action 按钮?
- 如何隐藏 QLPreviewController 的 Action 按钮?
- IOS 使用QLPreviewController浏览PDF WORD等文件
- iOS 使用QLPreviewController预览本地和网络文件
- QLPreviewController 展示TXT文本时中文乱码的解决方法
- QLPreviewController用法
- QLPreviewController用法
- Android Framework/base 学习记录
- jdbcTemplate.queryForObject 方法注意
- 专治linux不服——centos6.7下的一些小问题
- 在CentOS 6.6中安装Python2.7和Django的问题
- 中国信息咨询主要类型机构公司经营发展规模
- QLPreviewController的使用
- linux nginx启动 重启 关闭命令
- Google 地图经纬度解析
- 探讨跨域请求资源的几种方式
- 大话图像处理之入门篇
- 删除注释删除空格行方法
- 友盟更新总结
- 三种方法实现js跨域访问
- 制作U盘启动盘容量减少的解决办法