[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
支持并捐助
如果您覺得文章對您很有幫忙,希望得到您的支持。您的捐肋將會給予我最大的鼓勵,感謝您的支持!
| 支付寶捐助 | |||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|