iOS 加載PDF/Word/txt/ QuickLook/QLPreviewcontroller

記錄一個心碎的歷程,公司項目要求查看pdf合同文件,(合同)這里劃重點屿良。暫行方案,就是將pdf下載到本地痘昌,然后寫入沙盒緩存,加載pdf本地文件炬转。這是前提和方式辆苔。

當(dāng)然我想,如果只是下載加載pdf扼劈,那網(wǎng)上基本一大片都是解決方案驻啤,code4app上一大堆demo,但是荐吵,重點來了骑冗,合同上是有電子簽章的赊瞬,網(wǎng)上下載的demo基本都顯示不了電子簽章。

電子簽章如下: ?






當(dāng)然還有圓公章的電子版贼涩,還得打碼懶得傳了巧涧。

第一階段,我們采用webview加載pdf遥倦,當(dāng)然也不是直接用UIWebView谤绳,使用WKWebView+js注入,反正網(wǎng)上一搜一大堆谊迄,直接上代碼闷供。(可以顯示電子簽章)

WKWebViewConfiguration*config = [[WKWebViewConfigurationalloc]init];

WKUserContentController* wkUController = [[WKUserContentControlleralloc]init];

config.userContentController= wkUController;

// 注入JS對象名稱AppModel烟央,當(dāng)JS通過AppModel來調(diào)用時统诺,

// 我們可以在WKScriptMessageHandler代理中接收到

[config.userContentControlleraddScriptMessageHandler:selfname:@"AppModel"];

NSString*js =@"var meta = document.createElement('meta'); meta.setAttribute('name', 'viewport'); meta.setAttribute('content', 'width=device-width'); document.getElementsByTagName('head')[0].appendChild(meta);";

WKUserScript*wkUserScript = [[WKUserScriptalloc]initWithSource:js

injectionTime:WKUserScriptInjectionTimeAtDocumentEnd

forMainFrameOnly:YES];

// 添加自適應(yīng)屏幕寬度js調(diào)用的方法

[wkUControlleraddUserScript:wkUserScript];

WKWebView*webView = [[WKWebViewalloc]initWithFrame:CGRectMake(0,0,kScreenW,kScreenH-64)

configuration:config];

webView.backgroundColor= [UIColorwhiteColor];

webView.UIDelegate=self;

webView.navigationDelegate=self;

[self.viewaddSubview:webView];

_webView= webView;

第二階段,使用webview加載疑俭,雖然手勢放大縮小粮呢,都沒有問題,但是放大后很模糊钞艇,達不到pdf給人的清晰感覺啄寡,文件確實是清晰的。查了很多demo哩照,發(fā)現(xiàn)用coreImage重繪弄的很大神挺物,而且封裝的很方便,代表作品是star很多的?vrf/reader 飘弧。支持分頁识藤,標記選擇等等,很多功能次伶,缺點就是不顯示電子簽章(pass)痴昧,優(yōu)點是可修改性強,代碼修修改改可以做成自己需要的樣子冠王。

第三階段赶撰,查看到了OC自帶的系統(tǒng)加載文件控制器,UIDocumentInteractionController和QLPreviewController柱彻,逐個說吧豪娜,基本使用差不多,但是UIDocumentInteractionController基于NSObject哟楷,QLPreviewController是真正的控制器侵歇,第二個可以繼承,重寫子類吓蘑。

1.UIDocumentInteractionController

UIDocumentInteractionController*documentVc = [UIDocumentInteractionControllerinteractionControllerWithURL:url];

documentVc.delegate=self;

[documentVcpresentPreviewAnimated:YES];

實現(xiàn)代理方法

#pragma mark - UIDocumentInteractionController 代理方法

- (UIViewController *)documentInteractionControllerViewControllerForPreview:(UIDocumentInteractionController *)controller{

returnself;

}

- (UIView *)documentInteractionControllerViewForPreview:(UIDocumentInteractionController *)controller{

returnself.view;

}

- (CGRect)documentInteractionControllerRectForPreview:(UIDocumentInteractionController *)controller{

returnself.view.bounds;

}

實現(xiàn)效果很好惕虑,清晰度坟冲,手勢識別,但是上面自帶導(dǎo)航欄溃蔫,而且是系統(tǒng)的很丑的導(dǎo)航健提,首先不能隱藏,隱藏沒法自定義伟叛,總之不好用私痹。

2.QLPreviewController這是個系統(tǒng)控制器,可繼承實現(xiàn)子類

MINPDFViewController*preview = [[MINPDFViewControlleralloc]init];

UINavigationController*nav = [[UINavigationControlleralloc]initWithRootViewController:preview];

preview.url=self.mUrl;

[self.navigationControllerpresentViewController:navanimated:YEScompletion:nil];

注意到包裹了一層nav统刮,如果直接present這個子類紊遵,那恭喜你,和doc控制器一樣侥蒙,里面不可更改導(dǎo)航欄的東西暗膜,具體可以實踐操作一樣,

在繼承控制器實現(xiàn)類里鞭衩。

UILabel*titleView = [[UILabelalloc]initWithFrame:CGRectMake(0,0,36,20)];

titleView.font= [UIFontsystemFontOfSize:18];

titleView.text=@"預(yù)覽";

self.navigationItem.titleView= titleView;

UIButton*backButton = [UIButtonbuttonWithType:UIButtonTypeCustom];

[backButtonsetImage:[UIImageimageNamed:@"btnBack_black"]forState:UIControlStateNormal];

self.navigationItem.leftBarButtonItem= [[UIBarButtonItemalloc]initWithCustomView:backButton];

self.delegate=self;

self.dataSource=self;

不出意外学搜,修改了返回鍵和titleview,(代碼是精簡的)论衍。但是iOS11下瑞佩,在右側(cè)rightBarButtonItem 有個系統(tǒng)分享打開的按鈕。嘗試替換坯台,不行炬丸,設(shè)置為nil不行,最后在stackoverflow一個大神回復(fù)的一句話找到了解決辦法 在viewdidload中定義一個timer

[NSTimerscheduledTimerWithTimeInterval:0.01

target:self

selector:@selector(hideRightButton)

userInfo:nil

repeats:YES];

實現(xiàn)方法:

- (void)hideRightButton{

[[selfnavigationItem]setRightBarButtonItem:nilanimated:NO];

}實測隱藏有效蜒蕾,感覺像是view加載完成前稠炬,系統(tǒng)保護控制器不受修改,完成后才可以隱藏滥搭,但是使用延時方法隱藏?zé)o效酸纲。

一切看上去都那么美好,直到上了真機瑟匆,在iOS11下闽坡,剛進來是好的,下拉愁溜,有一塊空白疾嗅,大約64,看過wwdc的應(yīng)該知道那個任性的sb說過這個問題冕象,如果是tableview scrollerview 可以通過屬性關(guān)閉這個特性

if(@available(iOS11.0, *)) {

_tableView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;

}else{

self.automaticallyAdjustsScrollViewInsets=NO;

}

我找了無數(shù)方法代承,還是遍歷不出,系統(tǒng)QLPre控制器的 scrollerview渐扮,知道這個屬性也沒用论悴,一切進入了死角掖棉,還是stackoverflow 用蹩腳英語查了下解決辦法,有人用viewcontroller的view添加 precontroller的view膀估,實驗了下確實可行幔亥,但是百度上查的辦法并不行。試試這個察纯。

QLPreviewController* previewer = [[QLPreviewControlleralloc]init];

previewer.dataSource=self;

previewer.delegate=self;

CGFloatwidth =self.view.frame.size.width;

CGFloatheight =self.view.frame.size.height;

previewer.view.frame=CGRectMake(0,64, width, height-64);

[self.viewaddSubview:previewer.view];

NSString*version = [UIDevicecurrentDevice].systemVersion;

if(version.floatValue>=10.0) {

[selfaddChildViewController:previewer];

}else{

[previewerdidMoveToParentViewController:self];

}

代理實現(xiàn)還是一樣的

- (NSInteger)numberOfPreviewItemsInPreviewController:(QLPreviewController*)controller {

return1;

}

- (id)previewController:(QLPreviewController*)controller previewItemAtIndex:(NSInteger)index {

returnself.url;

}

這樣還有個好處帕棉,就是導(dǎo)航欄變成了之前push進當(dāng)前控制器的導(dǎo)航欄,沒有系統(tǒng)控件饼记,因為你只加載了view香伴,解決之前自定義問題,同時解決了下掉64的問題具则。

但是即纲,沒錯,但是又來了乡洼,在iOS9下崇裁,還是不顯示簽章匕坯,這是系統(tǒng)問題束昵,查了好多資料,不過根據(jù)向下兼容兩版本的原則葛峻,我們暫行锹雏,10 11使用系統(tǒng)控制器加載pdf,清晰大氣术奖,縮放手勢完整礁遵,9及9以下用戶,還是用webview加載采记,并行的方式佣耐,其他方法還在繼續(xù)尋找中,歡迎指正問題唧龄,提供解決辦法兼砖。github鏈接

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市既棺,隨后出現(xiàn)的幾起案子讽挟,更是在濱河造成了極大的恐慌,老刑警劉巖丸冕,帶你破解...
    沈念sama閱讀 221,273評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件耽梅,死亡現(xiàn)場離奇詭異,居然都是意外死亡胖烛,警方通過查閱死者的電腦和手機眼姐,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,349評論 3 398
  • 文/潘曉璐 我一進店門诅迷,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人众旗,你說我怎么就攤上這事竟贯。” “怎么了逝钥?”我有些...
    開封第一講書人閱讀 167,709評論 0 360
  • 文/不壞的土叔 我叫張陵屑那,是天一觀的道長。 經(jīng)常有香客問我艘款,道長持际,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,520評論 1 296
  • 正文 為了忘掉前任哗咆,我火速辦了婚禮蜘欲,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘晌柬。我一直安慰自己姥份,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 68,515評論 6 397
  • 文/花漫 我一把揭開白布年碘。 她就那樣靜靜地躺著澈歉,像睡著了一般。 火紅的嫁衣襯著肌膚如雪屿衅。 梳的紋絲不亂的頭發(fā)上埃难,一...
    開封第一講書人閱讀 52,158評論 1 308
  • 那天,我揣著相機與錄音涤久,去河邊找鬼涡尘。 笑死,一個胖子當(dāng)著我的面吹牛响迂,可吹牛的內(nèi)容都是我干的考抄。 我是一名探鬼主播,決...
    沈念sama閱讀 40,755評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼蔗彤,長吁一口氣:“原來是場噩夢啊……” “哼川梅!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起幕与,我...
    開封第一講書人閱讀 39,660評論 0 276
  • 序言:老撾萬榮一對情侶失蹤挑势,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后啦鸣,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體潮饱,經(jīng)...
    沈念sama閱讀 46,203評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,287評論 3 340
  • 正文 我和宋清朗相戀三年诫给,在試婚紗的時候發(fā)現(xiàn)自己被綠了香拉。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片啦扬。...
    茶點故事閱讀 40,427評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖凫碌,靈堂內(nèi)的尸體忽然破棺而出扑毡,到底是詐尸還是另有隱情,我是刑警寧澤盛险,帶...
    沈念sama閱讀 36,122評論 5 349
  • 正文 年R本政府宣布瞄摊,位于F島的核電站,受9級特大地震影響苦掘,放射性物質(zhì)發(fā)生泄漏换帜。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,801評論 3 333
  • 文/蒙蒙 一鹤啡、第九天 我趴在偏房一處隱蔽的房頂上張望惯驼。 院中可真熱鬧,春花似錦递瑰、人聲如沸祟牲。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,272評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽说贝。三九已至,卻和暖如春您朽,著一層夾襖步出監(jiān)牢的瞬間狂丝,已是汗流浹背换淆。 一陣腳步聲響...
    開封第一講書人閱讀 33,393評論 1 272
  • 我被黑心中介騙來泰國打工哗总, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人倍试。 一個月前我還...
    沈念sama閱讀 48,808評論 3 376
  • 正文 我出身青樓讯屈,卻偏偏與公主長得像,于是被迫代替她去往敵國和親县习。 傳聞我的和親對象是個殘疾皇子涮母,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,440評論 2 359

推薦閱讀更多精彩內(nèi)容