最近很多朋友看到了我的JS与OC/Swift交互的文章,经常有朋友问HTML中的图片在点击时如何在原生预览?这个问题其实很简单,只是一直没有动手去实践过。今天借着闲时,动手写了个demo,只是实现了点击接收,不实现预览功能,怎么预览就是大家要做的事了。

本篇文章只是说明通过怎样的方式接入,才能让iOS Native与Js交互,当然这里不会使用JavaScriptCore这个库,也不会使用任何第三方,如UIWebViewJavaScriptBridge。

实现代码

实现思路:面对iOS与JS交互,最直接的就是UIWebView的代理方法。那么,提炼出来的问题就是:如何知道H5中的图片被点击了?在点击以后又如何在iOS端判断?针对第一个问题,最直接的方式就是注入图片点击的JS代码。针对第二个问题,最直接的方式就是通过注入特定的scheme来识别:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48

@implementation ViewController
- (void)viewDidLoad {
  [super viewDidLoad];
  UIWebView *webview = [[UIWebView alloc] initWithFrame:self.view.bounds];
  [self.view addSubview:webview];
  webview.delegate = self;
  
  [webview loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.cocoachina.com/programmer/20160113/14976.html"]]];
}
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
  if ([request.URL.scheme hasPrefix:@"hyb-image-preview"]) {
    // 获取原始图片的完整URL
    NSString *src = [request.URL.absoluteString stringByReplacingOccurrencesOfString:@"hyb-image-preview:" withString:@""];
    if (src.length > 0) {
      // 原生API展开图片
      // 这里已经拿到所点击的图片的URL了,剩下的部分,自己处理了
      // 有时候会感觉点击无响应,这是因为webViewDidFinishLoad,还没有调用。
      // 调用很晚的原因,通常是因为H5页面中有比较多的内容在加载
      // 因此,若是原生APP与H5要交互,H5要尽可能地提高加载速度
      // 不相信?在webViewDidFinishLoad加个断点就知道了
      NSLog(@"所点击的HTML中的img标签的图片的URL为:%@", src);
    }
  }
  return YES;
}
- (void)webViewDidFinishLoad:(UIWebView *)webView {
  NSString *js = @"function addImgClickEvent() { \
                       var imgs = document.getElementsByTagName('img'); \
                       for (var i = 0; i < imgs.length; ++i) { \
                            var img = imgs[i]; \
                            img.onclick = function () { \
                                window.location.href = 'hyb-image-preview:' + this.src; \
                            }; \
                        } \
                   }";
  // 注入JS代码
  [webView stringByEvaluatingJavaScriptFromString:js];
  // 执行所注入的JS代码
  [webView stringByEvaluatingJavaScriptFromString:@"addImgClickEvent();"];
}
@end

这里需要到写JS函数,如何JS都不懂,那就不知道怎么办了,当然让后台帮你写也是可以的。这里所实现的功能是非常简单的,只是往H5中注入了JS函数,然后执行所注入的JS函数,给所有的img标签添加上onclick事件处理,在img被点击时,重新载入图片就会回调我们UIWebView的shouldStartLoadWithRequest代理方法,然后在此处识别是否是我们所指定的scheme,如果是,则认为这个是我们要处理的图片预览。

原文链接   http://www.huangyibiao.com/archives/441

转载于:https://www.cnblogs.com/jasonTc/p/5844691.html

ObjC点击H5图片Native预览相关推荐

  1. 配置全局less变量;解决iphoneX、 iphone8 plus 键盘退下去仍占空间,导致无法点击;vue-photo-preview 配置正常,但无法触发图片的预览

    1.配置全局less变量 pluginOptions: {"style-resources-loader": {preProcessor: "less",pat ...

  2. 微信小程序:常用功能6——点击图片,实现图片的预览功能wx.previewImage(Object object, boolean showmenu)

    向用户展示图片时,为了展现布局的美观性,往往不同尺寸的图片要放在相同大小的容器中. 但是图片想让用户看清.或者保存时,我们就要进行图片的预览,像用户展示原图. 图片预览接口:wx.previewIma ...

  3. 微信小程序:点击图片进行预览

    在开发需求中,经常有类似与九宫格的图片展示,当点击图片时进行图片的预览,如果多图的情况还可以左右滑动. 小程序中具体实现效果如下: WXML <view class='imgList'> ...

  4. 微信小程序图片放大预览效果的实现,轮播图点击放大预览

    近期很多刚学习小程序的同学,想做哪种图片点击放大,然后可以左右滑动预览的效果.我也特意去研究下,发现直接用微信程序自己的api就可以很方便的实现.今天就来教大家如何实现小程序图片点击放大的效果. 老规 ...

  5. H5上传照片、图片及预览裁剪

    H5上传照片.图片及预览裁剪 忙里得闲将之前工作中遇到的问题进行总结 要实现该效果主要分三步 一.如何获取图片及照片甚至打开手机摄像头 刚开始做的时候,本人也是一片茫然,怎么获取图片甚至控制摄像机?在 ...

  6. html图片点击局部放大,jQuery教程 css+jQuery实现图片局部放大预览

    本篇教程介绍了jQuery教程 css+jQuery实现图片局部放大预览,希望阅读本篇文章以后大家有所收获,帮助大家对jQuery的理解更加深入. < 今天有时间开始动手,使用css+jquer ...

  7. H5拍照、预览、压缩、上传采坑记录

    H5拍照.预览.压缩.上传采坑记录 公司项目前段时间需要实现手机拍照上传的功能,本来以为用createObjectURL和canvas可以很轻松的实现,结果发现问题多多,特此记录下来. DEMO预览( ...

  8. vue本地上传并预览php,vue.js 实现图片本地预览 裁剪 压缩 上传功能

    以下代码涉及 Vue 2.0 及 ES6 语法. 目标 纯 javascrpit 实现,兼容ie9及以上浏览器,在本地做好文件格式.长宽.大小的检测,减少浏览器交互. 现实是残酷的,为了兼容Ie9 还 ...

  9. 微信小程序图片放大预览效果的实现

    效果预览 效果图有点快,但是可以大致看出来效果了.我再给大家描述下吧 一个页面有3张图片,点击其中任意一张都可以放大预览.然后在预览的时候,左右滑动,还可以看另外两张图片. 话不多说,直接上代码 1, ...

  10. jQuery Lightbox图片放大预览

    简介:jQuery Lightbox图片放大预览代码是一款可以在用户点击页面中的小图片时,将该图片的高清版本以Lightbox的方式放大显示在页面的中间,提高用户的体验度. 效果展示 http://h ...

最新文章

  1. 【牛腩新闻发布系统】整合前台04
  2. 互斥量、读写锁长占时分析的利器——valgrind的DRD
  3. 建设公司的技术+企业客户的沟通=极致运行的网站
  4. 高级交换路由课程PPT下载打包了
  5. 一文教你快速上手PyFlink
  6. ic designer
  7. CSocket类的使用
  8. VMware中虚拟机与主机不能ping通解决办法
  9. ucos ii 文件分析
  10. 存款惊人_如何使您的图快速美丽惊人
  11. 玩转oracle 11g(20):ora-00604和ora-00018
  12. Perl 模块 Getopt::Std 和 Getopt::Long
  13. CentOS 7安装之后的七个事
  14. c语言快递信息系统有哪些信息,国内知名物流信息管理系统软件有哪些?分别是什么?...
  15. 服务器装win7找不到硬盘驱动,电脑找不到硬盘驱动器,教你win7电脑找不到硬盘驱动器的解决方法...
  16. html制作朋友圈素材,微信朋友圈图文素材
  17. phpstudy快速搭建网站步骤(手把手教你搭建)
  18. 微信音乐回复时出现“链接无效,无法播放”的情况
  19. App推广活动方案策划步骤
  20. 百度网盘无限扩容技术,外面399,无论自己用还是用做引流都可以

热门文章

  1. 调用目标检测百度接口api
  2. 回顾频谱图卷积的经典工作:从ChebNet到GCN
  3. Machine Learning Basics(要点)
  4. python实现同一目录文件下所有Excel数据文件的合并
  5. hash算法总结收集
  6. html 加粗_一篇文章带你了解HTML格式化元素
  7. 微信小程序云开发教程-微信小程序的API入门-获取用户身份信息系列API
  8. android其他占用存储,Android如何梳理内存占用情况解决OOM问题
  9. JavaSE——Java8之函数式接口、函数式编程、Lambda表达式
  10. 基于springboot+vue的房屋租赁系统(前后端分离)