最近有做文件的预览,在使用QuickLook的时候,对于Excel的展示不太符合预期,特此去捣鼓了一下,最终基本满足了要求
1.Excel预览问题
iOS文件预览的方式有多种-QuickLook、WebView、UIDocument的方式;
我选择了QuickLook框架去预览,在手机上Word、PDF、PPT都还是效果很不错的,可Excel的展示就难以接受了。
先看下效果:
具体表现就是没有撑满,而且字很小,需要放大之后才能看的清,这对于用户来说体验就差了。
2.Excel预览优化
尝试1:能否设置一个缩放参数
试试看能不能对QLPreviewController
的内容设置个缩放,让其能撑满,但是查了API和文档发现没有可以设置的地方;
于是想看看图层结构来获取到视图(比如:ScrollView)然后来设置,结果使用Xcode去调试却看不到图层信息。
时间紧,就没去深究了,换方案试试
尝试2:修改预览的方案改为WKWebView
改为WKWebView去展示的契机,是我将相同的文件发到微信,看了下微信的效果,蛮符合预期的。
于是就用Lookin去看了下微信的实现:
可以看到微信就是用WKWebView去加载Excel文件的,方向找到了,那就开始干吧。
于是很快啊改成WKWebView来加载Excel了,但是发现展示的效果跟QuickLook也没啥区别的,看来微信是做了特殊处理了,于是就再次Debug了一下微信看看
发现不同的文件scrollView的zoomScale还不一样,难不成还要解析Excel内容来动态的设置这个zoomScale吗,这咱也不会啊,感兴趣的可以去逆向一下微信,看看微信的伪代码是如何实现的。
我的初步想法就是设置一个固定的scale来试试效果:简单来说就是给webview的scrollView设置一个zoomScale来让展示的好看点,但是存在一个问题就是需要等Excel加载出来之后再设置zoomScale才会生效,这显然不符合预期。
有没有一个方法能直接在Excel渲染的时候就指定scale了??
如果有那可太好了,于是就搜索了一下,后来发现确实可以有,通过注入script的方式就可以做到。
话不多说上代码:
- (void)showPreview {
NSString *jsString = @"var script = document.createElement('meta');"
"script.name = 'viewport';"
"script.content=\"width=device-width, initial-scale=1.0, minimum-scale=1.0, user-scalable=yes\";"
"document.getElementsByTagName('head')[0].appendChild(script);";
WKWebViewConfiguration *configuration = [[WKWebViewConfiguration alloc] init];
WKUserScript *userScript = [[WKUserScript alloc] initWithSource:jsString injectionTime:WKUserScriptInjectionTimeAtDocumentEnd forMainFrameOnly:YES];
[configuration.userContentController addUserScript:userScript];
WKWebView *previewWebView = [[WKWebView alloc] initWithFrame:self.view.bounds configuration:configuration];
NSURL *accessURL = [[NSURL fileURLWithPath:self.fileLocalPath] URLByDeletingLastPathComponent];
[previewWebView loadFileURL:[NSURL fileURLWithPath:self.fileLocalPath] allowingReadAccessToURL:accessURL];
//NSURLRequest *request = [[NSURLRequest alloc] initWithURL:[NSURL fileURLWithPath:self.fileLocalPath]];
//[previewWebView loadRequest:request];
[self.view addSubview:previewWebView];
}
3.最终效果展示
基本上是跟微信的效果一样