iOS原生如何加载HTML中img标签的图片
原文出自:iOS原生如何加载HTML中img标签的图片
前言
最近iOS App项目中使用Webview加载H5页面比较多,也有不少朋友经常问到这个问题,在这里我也学习学习如何通过iOS原生的方式来加载H5页面中的图片然后让webview显示图片。
相信有很多朋友也遇到过这样的问题,可是很多朋友都没有思路,不知如何入手。今天,刚好学习了一下,并写了一个简单的demo。下面让我们一起来学习一下吧!
本篇文章适合哪些人群阅读?
- 项目中有类似需求的,而又没有思路的
- 曾经做过类似需求的,可以参考两者的思想有何异同,比较哪种方式更好
- 没有做过类似需求,且也没有思路入手的,可以参考学习
注意:本文有Objective-C版和Swift,根据个人情况看相关章节
思路讲解
这里有两种方式可以实现:
- 直接使用NSData同步加载图片的方式(Swift版用同步实现)
- 通过其他第三方库异步加载图片的方式(ObjC版用异步实现)
Swift版代码讲解
下面看看我们的核心代码吧:
let path = NSBundle.mainBundle().pathForResource("test", ofType: "html")
let url = NSURL(fileURLWithPath: path!)do {let html = try String(contentsOfURL: url, encoding: NSUTF8StringEncoding)// print(html)// 获取所有img src中的src链接,并将src更改名称// 这里直接采用同步获取数据,异步也是一样的道理,为了方便写demo,仅以同步加载图片为例。// 另外,这不考虑清除缓存的问题。do {let regex = try NSRegularExpression(pattern: "<img\\ssrc[^>]*/>", options: .AllowCommentsAndWhitespace)let result = regex.matchesInString(html, options: .ReportCompletion, range: NSMakeRange(0, html.characters.count))var content = html as NSStringvar sourceSrcs: [String: String] = ["": ""]for item in result {let range = item.rangeAtIndex(0)let imgHtml = content.substringWithRange(range) as NSStringvar array = [""]if imgHtml.rangeOfString("src=\"").location != NSNotFound {array = imgHtml.componentsSeparatedByString("src=\"")} else if imgHtml.rangeOfString("src=").location != NSNotFound {array = imgHtml.componentsSeparatedByString("src=")}if array.count >= 2 {var src = array[1] as NSStringif src.rangeOfString("\"").location != NSNotFound {src = src.substringToIndex(src.rangeOfString("\"").location)// 图片链接正确解析出来print(src)// 加载图片// 这里不处理重复加载的问题,实际开发中,应该要做一下处理。// 也就是先判断是否已经加载过,且未清理掉该缓存的图片。如果// 已经缓存过,否则才执行下面的语句。let data = NSData(contentsOfURL: NSURL(string: src as String)!)let localUrl = self.saveImageData(data!, name: (src as String).md5)// 记录下原URL和本地URL// 如果用异步加载图片的方式,先可以提交将每个URL起好名字,由于这里使用的是原URL的md5作为名称,// 因此每个URL的名字是固定的。sourceSrcs[src as String] = localUrl}}}for (src, localUrl) in sourceSrcs {if !localUrl.isEmpty {content = content.stringByReplacingOccurrencesOfString(src as String, withString: localUrl, options: NSStringCompareOptions.LiteralSearch, range: NSMakeRange(0, content.length))}}print(content as String)webView.loadHTMLString(content as String, baseURL: url)} catch {print("match error")}
} catch {print("load html error")
}
此处省略1000字,完整阅读文章内容,请移步微信公众号阅读。
移步微信公众号阅读全文
源代码
想要下载源代码,请移步github下载,内有Swift版的工程和ObjC版的工程:
https://github.com/CoderJackyHuang/iOSLoadWebViewImage
公众号搜索「iOS开发技术分享」快速关注微信号:iOSDevShares QQ群:324400294
iOS原生如何加载HTML中img标签的图片相关推荐
- android隐私违规获取问题处理 及 Hook拦截处理记录 (VirtualXposted/epic等)及 android/iOS 多bundle加载方式修复方案
文章目录 1.如何检测/复现 android_id/Mac地址等权限被超前获取 ```但是,检测机构是如何检测我们的APP?``` 关于hooklogin插件 太极 ---- 以上基础工作完成---- ...
- iOS开发之加载大量网络图片优化
2019独角兽企业重金招聘Python工程师标准>>> 1.概述 在IOS下通过URL读一张网络图片并不像其他编程语言那样可以直接把图片路径放到图片路径的位置就ok,而是需要我们通过 ...
- CGContextRef绘图-iOS球形波浪加载进度控件-HcdProcessView详解
简书也有发布:http://www.jianshu.com/p/20d7... <iOS球形波浪加载进度控件-HcdProcessView>这篇文章已经展示了我在项目中编写的一个球形进度加 ...
- 【iOS】—— 懒加载
懒加载 首先,要明白懒加载的概念,懒加载的实质就是延迟加载,iOS设备在加载时有限度,如果我们的数据很大,一次性将其全部加载出来可能对内存的损耗比较大,懒加载的作用就是将其在需要的时候再加载出来. 懒 ...
- 原生代码加载网络图片和Volley和Picasso的简单介绍和优缺点对比
网路下载图片,并以滚动列表的方式展示图片资源,是一种典型的Android App开发场景,但是如何更好的去实现这种效果一直是Android程序员所头疼的事情.比如,将下载的图片数据存储到本地,那就会造 ...
- UTF8文件带BOM引起的问题——iOS端竟然加载出了html代码
起因是公司iOS端竟然加载出来了HTML代码,百思不得其解,查文献,原来如此... UTF-8 不需要 BOM,尽管 Unicode 标准允许在 UTF-8 中使用 BOM. 所以不含 BOM 的 U ...
- excel2007无法加载mysql_Excel2007中进行无法安装加载项的解决方法
最近在学数学模型,用规划求解来计算.以前用Excel XP,知道在工具中加载相关的宏,然后很顺利地就能求解.但是用Excel 2007就找不到北了,今天,学习啦小编就教大家在Excel2007中进行无 ...
- VS2010打开项目提示未能正确加载解决方案中一个或多个项目
今天打开vs2010项目,竟然提示"未能正确加载解决方案中一个或多个项目",还有什么详细去输出看,我在网上找了下,没有解决,我看输出下边是说"C:\Program Fil ...
- Android中WebView加载sdcard中的html时提示:ERR_FILE_NOT_FOUND和ERR_ACCESS_DENIED
场景 Android中WebView加载sdcard中的html显示: Android中WebView加载sdcard中的html显示_BADAO_LIUMANG_QIZHI的博客-CSDN博客 在实 ...
最新文章
- 成功解决TypeError: ufunc 'sqrt' not supported for the input types, and the inputs could not be safely co
- 打车APP大数据宰客套路多:苹果比安卓贵、熟客比新客贵
- python画图标题为蓝色_python绘制语谱图怎么设置成黄蓝色
- layui绑定json_认识定制:JSON绑定概述系列
- Flask项目--发送短信验证码
- nginx备忘录,错误a duplicate default server for 0.0.0.0:80
- (转载) 标准C中的字符串操作函数
- bluecam连接步骤说明_智能门锁安装步骤分享
- jQuery Validate验证框架(转载)
- There were no servers available to complete the specified operation
- silverlight4 开发必备
- 黑苹果卡在白苹果不动_从黑苹果到“白苹果”这一年我经历了什么
- 单片机c语言实验报告心得,关于单片机实训心得体会
- finalcut剪切快捷键_【FCPX】Final Cut Pro X 常用快捷键大全
- Word-VBA:删除选择区域的项目符号
- 使用update!导致的更新时候的错误信息不显示 ruby on rails
- 背靠Mobileye/降价抢市场,经纬恒润闯关IPO背后“危机四伏”
- tomcat-命令窗口乱码
- 这家为AI for Science而生的新研究院,要让科研进入“安卓模式”
- 高数下|级数6|手写笔记(幂级数求和)
热门文章
- C++实现十大排序算法(冒泡,选择,插入,归并,快速,堆,希尔,桶,计数,基数)排序算法时间复杂度、空间复杂度、稳定性比较(面试经验总结)
- SLAM笔记(五)光束平差法(Bundle Adjustment)
- gdb+gdbserver
- nginx和squid配合搭建的web服务器前端系统
- Windows C++中__declspec(dllexport)的使用
- 【Linux】neocomplcache disabled: “sudo vim“ is detected and $HOME is set to your user‘s home
- 【Qt】Qt5在ubuntu16.04无法输入中文解决方式
- 大学计算机专业副修课,计算机学院举行本科课程教学大纲修订工作研讨会
- python自动办公 pdf_Python办公自动化|批量合并PDF,拿来就用
- 服务器磁盘阵列做win7系统,Raid0可以安装winxp-x86,但不能安装win7-x64,是怎么回事呢?!...