[Swift版]H5點擊圖片預覽

wwoc3453 9年前發布 | 33K 次閱讀 Swift Apple Swift開發 JavaScript

來自: 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

支持并捐助

如果您覺得文章對您很有幫忙,希望得到您的支持。您的捐肋將會給予我最大的鼓勵,感謝您的支持!

<th>微信捐助</th>

</tr>

</thead>

<td> <img src="https://simg.open-open.com/show/3bef3b99597282da299c6e97fa777537.jpg" class="alignCenter" width="320" height="442" /> </td>

</tr>

</tbody>

</table> </div>

 本文由用戶 wwoc3453 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!
支付寶捐助
  • sesese色