[Swift版]H5點擊圖片預覽
來自: http://www.henishuo.com/html-img-preview/
前言
最近很多朋友看到了我的JS與OC/Swift交互的文章,經常有朋友問HTML中的圖片在點擊時如何在原生預覽?這個問題其實很簡單,只是一直沒有動手去實踐過。今天借著閑時,動手寫了個demo,只是實現了點擊接收,不實現預覽功能,怎么預覽就是大家要做的事了。
本篇文章只是說明通過怎樣的方式接入,才能讓iOS Native與Js交互,當然這里不會使用JavaScriptCore這個庫,也不會使用任何第三方,如UIWebViewJavaScriptBridge。
如果您正在找的是Objective-C版,請閱讀: http://www.henishuo.com/objc-html-img-preview/
Swift實現代碼
實現思路:面對iOS與JS交互,最直接的就是UIWebView的代理方法。那么,提煉出來的問題就是:如何知道H5中的圖片被點擊了?在點擊以后又如何在iOS端判斷?針對第一個問題,最直接的方式就是注入圖片點擊的JS代碼。針對第二個問題,最直接的方式就是通過注入特定的scheme來識別:
classViewController: UIViewController, UIWebViewDelegate { varwebView = UIWebView() overridefuncviewDidLoad() { super.viewDidLoad() self.view.addSubview(self.webView) self.webView.delegate = self self.webView.frame = self.view.bounds self.webView.loadRequest(NSURLRequest(URL: NSURL(string: "http://www.cocoachina.com/programmer/20160113/14976.html")!)) } // MARK: UIWebViewDelegate funcwebView(webView: UIWebView, shouldStartLoadWithRequestrequest: NSURLRequest,navigationType: UIWebViewNavigationType) -> Bool { letscheme = "hyb-image-preview:" // 由于我們注入了JS,在點擊HTML中的圖片時,就會跳轉,然后在此處就可以攔截到 if ((request.URL?.scheme.hasPrefix(scheme)) != nil) { // 獲取原始圖片的URL letsrc = request.URL?.absoluteString.stringByReplacingOccurrencesOfString(scheme,withString: "") if letimageUrl = src { // 原生API展開圖片 // 這里已經拿到所點擊的圖片的URL了,剩下的部分,自己處理了 // 有時候會感覺點擊無響應,這是因為webViewDidFinishLoad,還沒有調用。 // 調用很晚的原因,通常是因為H5頁面中有比較多的內容在加載 // 因此,若是原生APP與H5要交互,H5要盡可能地提高加載速度 // 不相信?在webViewDidFinishLoad加個斷點就知道了 print(imageUrl) } } return true } funcwebViewDidFinishLoad(webView: UIWebView) { // 在H5頁面加載完成時,注入圖片點擊的JS代碼 letjs = "function addImgClickEvent() { " + "var imgs = document.getElementsByTagName('img');" + // 遍歷所有的img標簽,統一加上點擊事件 "for (var i = 0; i < imgs.length; ++i) {" + "var img = imgs[i];" + "img.onclick = function () {" + // 給圖片添加URL scheme,以便在攔截時可能識別跳轉 "window.location.href = 'hyb-image-preview:' + this.src;" + "}" + "}" + "}" // 注入JS代碼 self.webView.stringByEvaluatingJavaScriptFromString(js) // 執行所注入的JS self.webView.stringByEvaluatingJavaScriptFromString("addImgClickEvent();") } }
這里需要到寫JS函數,如何JS都不懂,那就不知道怎么辦了,當然讓后臺幫你寫也是可以的。這里所實現的功能是非常簡單的,只是往H5中注入了JS函數,然后執行所注入的JS函數,給所有的img標簽添加上onclick事件處理,在img被點擊時,重新載入圖片就會回調我們UIWebView的shouldStartLoadWithRequest代理方法,然后在此處識別是否是我們所指定的scheme,如果是,則認為這個是我們要處理的圖片預覽。
源代碼
請大家到我的GITHUB地址下載吧: https://github.com/CoderJackyHuang/HTMLImagePreviewDemo
喜歡就關注,順便給個star!
關注我
Swift/ObjC技術群一: 324400294(已滿)
Swift/ObjC技術群二: 494669518
ObjC/Swift高級群: 461252383(注明年限,新手勿擾)
關注微信公眾號: iOSDevShares
關注新浪微博賬號:標哥Jacky
標哥的GITHUB地址: CoderJackyHuang
支持并捐助
如果您覺得文章對您很有幫忙,希望得到您的支持。您的捐肋將會給予我最大的鼓勵,感謝您的支持!
支付寶捐助 | |||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
![]() |