iOS知识点iOS开发者图书馆

iOS文件预览Excel的正确打开方式

2020-12-24  本文已影响0人  jayhe

最近有做文件的预览,在使用QuickLook的时候,对于Excel的展示不太符合预期,特此去捣鼓了一下,最终基本满足了要求

1.Excel预览问题

iOS文件预览的方式有多种-QuickLook、WebView、UIDocument的方式;

我选择了QuickLook框架去预览,在手机上Word、PDF、PPT都还是效果很不错的,可Excel的展示就难以接受了。

先看下效果:


图片.png

具体表现就是没有撑满,而且字很小,需要放大之后才能看的清,这对于用户来说体验就差了。

2.Excel预览优化

尝试1:能否设置一个缩放参数
试试看能不能对QLPreviewController的内容设置个缩放,让其能撑满,但是查了API和文档发现没有可以设置的地方;

于是想看看图层结构来获取到视图(比如:ScrollView)然后来设置,结果使用Xcode去调试却看不到图层信息。


图片.png

时间紧,就没去深究了,换方案试试

尝试2:修改预览的方案改为WKWebView
改为WKWebView去展示的契机,是我将相同的文件发到微信,看了下微信的效果,蛮符合预期的。

于是就用Lookin去看了下微信的实现:


图片.png

可以看到微信就是用WKWebView去加载Excel文件的,方向找到了,那就开始干吧。

于是很快啊改成WKWebView来加载Excel了,但是发现展示的效果跟QuickLook也没啥区别的,看来微信是做了特殊处理了,于是就再次Debug了一下微信看看


图片.png

发现不同的文件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.最终效果展示

基本上是跟微信的效果一样


图片.png
上一篇下一篇

猜你喜欢

热点阅读