浅谈quickLook

来源:互联网 发布:淘宝苏宁卡可以用么 编辑:程序博客网 时间:2024/06/08 02:23

因为公司最近项目升级需要阅览office文档,所以用到quicklook来做这块。刚开始上网查了一下quicklook的用法,发现很简单,只是导入<QuickLook/QuickLook.h>这个头文件,然后在工程里添加对应的库,遵循一个dataSource协议和delegate就可以了,实现数据加载,只需要实现datasource要求的两个回调方法即可。但是,问题来了,根据苹果官方文档介绍,QLPreviewController可以用pushViewController的方法或者presentViewCtroller的方法来加载文档视图,网上很多例子是用addsubview的方法直接将QLPreviewController.view添加到视图上的,现在来说说这几种的区别吧。

首先是presentViewController的方式,用这种方式弹出QLPreviewController,加载是正确的,显示的格调是quicklook自带的方式,上面的navBar是酱紫滴:额,公司不允许上传东西,所以截图也上不了了,但是可以描述一下哈

Done                文本title             action按钮

大致就是像上面所排列的样子,navBar是ios自带的,所以想换成别的方式或者想去掉action按钮是做不成的,但是

第二种方式:pushViewCtroller是可以的,用这种方式前提需要有个NavgationCtroller才可以,然后pushQLPreviewController,这种方式显示的QLPreviewController的navBar是酱紫滴:

<Back               文本title             action按钮

返回按钮触发自动回到pushQLPreviewController的执行者视图控制器,如果你试图更改返回按钮的title或者自定义,这里是可以操作的,但是action按钮,sorry目前我还不造怎么更改,如果有人做到,请给我小纸条留言告知一下做法,谢谢!(!!!我已经知道怎么更改quicklook上自带的navbar了,原来是我写的方式不对,以前总是这么更改上面的选项item:
    self.navigationController.navigationItem.rightBarButtonItems = .........;

一般来说都是这么改的,但是这么写肯定是改不过来的,要这么写:

    self.navigationItem.rightBarButtonItems = .......;

才可以改过来,%>_<%想shi的心都有了)

以上这两种实现方式,都是自带navBar,如果你的UI设计不需要显示navBar,或者打开office文档

的页面不存在navBar或者不显示navBar,你可以选择addsubView方式,但是,这种方式在office文档阅览页面是没有QLPreviewController自带的手势事件(即点击全屏,再次点击恢复),想自己添加手势的童鞋可以洗洗睡了,我早已试过,行不通,在这里有必要向大家解释一下QLPreviewController是什么,其实我也了解不多,但是一句话概括起来就是QLPreviewController虽然看着是个普通的UIViewController但是并不是,在网上查到相关的资料了解到QLPreviewController是RemoteController,什么是RemoteController?如名字直译,(以下是网上资料原话:RemoteController是以XPC的方式运行。XPC有几个好处:

1以简单高效的方式,进行进程间的通信

2、OS系统来控制XPC进程的生命周期

简单的理解就是QLPreviewController就是单独一个进程,你的App通过操作系统来与之通信后,QLPreviewController怎么运行和你的App没有关系,由操作系统来控制。)

iOS中RemoteController有很多,比如:MailComposerViewController等等,有兴趣的可以自己查查,学到了同样小纸条留言给我哈,谢谢啦!

言归正传,这里大家应该知道了为毛手势添加不成了吧,这里还要告诉大家一个不幸的消息,QLPreviewController不但加不了手势,连旋转屏幕都一样与众不同,我刚开始用present方式弹出QLPreviewController视图,结果在打开office文档之后横屏,ok,显示正常,点击Done按钮回到原先的页面,发现显示的页面竟然还是竖屏的。所以在这里告诫想使用quicklook的童鞋,最好用push的方法或者addsubView的方式,总而言之,就是要让QLPreviewController跟外面其他视图有联系,否则QLPreviewController将会成为一个“与世隔绝的孤岛”。

如果我既想用QLPreviewController自带的navBar还不想前面pushQLPreviewController的视图控制器显示出来,怎么办捏,叮咚,我就是要这样的UI设定(可恶的UI式样),经过不懈努力,终于做出来了,那就是在pushQLPreviewController的视图控制器的- (void)viewWillApear方法里,将self.navigationController setNavBarHidden为YES,然后自定义一个视图控制器,继承QLPreviewController,将一系列的实现方法写好在.m文件中-(void)viewWillApear方法里将self.navgationCtroller setNavBarHidden为NO就可以啦,这样重写QLPreviewController的视图控制器还可以响应横竖屏切换,而且做扩展也容易。

在这里还有个问题要说明一下,我当时用QLPreviewController打开的文档名字是用数字命名的,QLPreviewController打开后navBar自带的把文档名字 作为navBar的title,显然这样是不科学的,因为office文档是有正经的文件名的,只不过写下载模块的哥们为了省事,搞了个数字存为文件名,这可难为坏我了,为了改这个titile废了九牛二虎之力,看苹果官方QLPreviewController的文档发现有个QLPreviewItem属性,看了半天没怎么理解这个东西怎么用,后来在github上找到个demo,意外之喜啊,终于找到方向了,参照了demo写的用法,终于把navBar上的title改了过来。在这里原谅我贴不了代码,公司规定很严,我也没办法。所以把demo地址留下,希望参照使用:如果有人来到我这偏僻角落,并且也在为quicklook烦恼着,希望能帮到你,有什么问题可以同样扔小纸条留言我。

demo地址


================我是卡哇伊的分割线=================

在测试阶段发现了quicklook的好多问题,有的office文件,如果在 windows下的office软件正常打开,但是mac上的office软件打不开,那同样quicklook也打不开,另外刚才发现了个问题,我猜测是quicklook在8.0的bug,但是详细信息也不得而知,打开一个excel文件(可能这个excel文件有什么特殊之处),在7.0的运行正常,但是在8.0上,当放大该文件进行旋转屏幕的时候,就会报出错误:

Received unkown error: Error Domain=_UIViewServiceInterfaceErrorDomain Code=3 "The operation couldn’t be completed. (_UIViewServiceInterfaceErrorDomain error 3.)" UserInfo=0x180bb310 {Message=Service Connection Interrupted}

对此我也没有任何办法,把该excel文件拷贝到其他quicklook的demo上发现也存在此问题,但是我试了其他的excel文件却没有这现象,可能还是这个excel文件有特殊的地方,但具体特殊在哪里,俺也不知道,更奇怪的是在7.0却没有这样的错误,真真是奇怪的很呐,希望以后有童鞋能够研究一下,告知一下,谢谢。


0 0