iOS 怎么查看UIWebView中的图片

2016-07-22  本文已影响298人  iwasee

1.获取html数据

let htmlData = NSData(contentsOfURL: url) // 获取网页数据

2.创建JS代码

* JS代码实现如下

* 创建数据保存img标签的src属性的数组imgsrcs

* getElementsByTagName获取所有的img元素images

* 遍历images中的一个个image元素

* 拿到image元素的parentNode元素

* parentNode删除image子元素

* 创建a标签的元素

* 设置a标签的href

* 把image元素添加到a的子元素中

* 把a元素添加到parentNode元素中

* 获取image的src属性添加到数组imgsrcs中

* 创建函数photos 返回imgsrcs中所有元素通过>><<拼接的字符串

* 大致目的有两个:

* 1.给图片都添加到a标签中,一边UIWebView的delegate能响应

* func webView(webView: UIWebView, shouldStartLoadWithRequest request: NSURLRequest, navigationType: UIWebViewNavigationType) -> Bool

* 2.photos函数是为了能通过UIWebView的方法能得到所有的图片资源

* let str = self.webView.stringByEvaluatingJavaScriptFromString(“photos()”)

3.将JS代码添加html文件中

let _bodyRange = hs.rangeOfString(“”

let html = hs.stringByReplacingCharactersInRange(_bodyRange, withString: script)

4.将新的html保存到本地,重新加载html数据

5.通过a标签的事件,触发UIWebViewDelegate的

func webView(webView: UIWebView, shouldStartLoadWithRequest request: NSURLRequest, navigationType: UIWebViewNavigationType) -> Bool

事件,处理相关的问题

具体代码突下:

/**

* 通过url得到网页数据,添加自己需要修改的JS代码到网页数据中,生成新的网页数据

/

func html(url: String) -> String? {

if let url = NSURL(string: url) {

let htmlData = NSData(contentsOfURL: url) // 获取网页数据

var htmlStr: String? = nil

// JS代码

/*

* JS代码实现如下

* 创建数据保存img标签的src属性的数组imgsrcs

* getElementsByTagName获取所有的img元素images

* 遍历images中的一个个image元素

* 拿到image元素的parentNode元素

* parentNode删除image子元素

* 创建a标签的元素

* 设置a标签的href

* 把image元素添加到a的子元素中

* 把a元素添加到parentNode元素中

* 获取image的src属性添加到数组imgsrcs中

* 创建函数photos 返回imgsrcs中所有元素通过>><<拼接的字符串

* 大致目的有两个:

* 1.给图片都添加到a标签中,一边UIWebView的delegate能响应

* func webView(webView: UIWebView, shouldStartLoadWithRequest request: NSURLRequest, navigationType: UIWebViewNavigationType) -> Bool

* 2.photos函数是为了能通过UIWebView的方法能得到所有的图片资源

* let str = self.webView.stringByEvaluatingJavaScriptFromString(“photos()”)

*/

let script = "\t\n\t\t imgsrcs = Array(); \n\t\t images = document.getElementsByTagName(\"img\"); \n\t\t for (i = 0; i < images.length; i++) { \n\t\t\t image = images[i]; \n\t\t\t imageParentNode = image.parentNode; \n\t\t\t imageParentNode.removeChild(image); \n\t\t\t a = document.createElement(\"a\"); \n\t\t\t  a.setAttribute(\"href\", String(i)); \n\t\t\t a.appendChild(image); \n\t\t\t imageParentNode.appendChild(a); \n\t\t\t imgsrcs.push(image.src); \n\t\t\t document.write(image.src + \"
\") \n\t\t } \n\t function photos() { imgsrcsStr = String(); for (i = 0; i < imgsrcs.length; i++) { imgsrcsStr += imgsrcs[i]; if (i+1 != imgsrcs.length) { imgsrcsStr += \">><<\"; } } return imgsrcsStr; } \t\n\n \n"

if let hd = htmlData {

htmlStr = String(data: hd, encoding: NSUTF8StringEncoding)

if let hs = htmlStr {

if let _bodyRange = hs.rangeOfString(“”) {

// 添加JS到网页数据中

let html = hs.stringByReplacingCharactersInRange(_bodyRange, withString: script)

// try! html.writeToFile(“/Users/xf-bao/Desktop/index.html”, atomically: true, encoding: NSUTF8StringEncoding)

return html // 返回新的网页数据

}

}

return nil

}

}

return nil

}

// UIWebViewDelegate a标签的事件响应

func webView(webView: UIWebView, shouldStartLoadWithRequest request: NSURLRequest, navigationType: UIWebViewNavigationType) -> Bool {

// print(“UIWebViewNavigationType: (navigationType)”)

if navigationType == .LinkClicked {

if !self.images.isEmpty {

} else {

let str = self.webView.stringByEvaluatingJavaScriptFromString(“photos()”)

// print(str)

if let https = str?.componentsSeparatedByString(“>><<”) {

for http in https {

if http.hasPrefix(“http”) {

let photo = MWPhoto(URL: NSURL(string: http))

self.images.append(photo)

}

}

}

}

let url = request.URL

let urlStr = url?.absoluteString

let numStr = urlStr?.componentsSeparatedByString(“/”).last

if let numStr = numStr {

if let i = Int(numStr) {

self.title = nil

let browser = MWPhotoBrowser(delegate: self)

browser.setCurrentPhotoIndex(UInt(i))

browser.displayActionButton = false

self.navigationController?.pushViewController(browser, animated: true)

}

}

}

return true

}

// 初始化UIWebView对象

var flag = false

let htmlStr = html(self.url)

if let hs = htmlStr {

let htmlData = hs.dataUsingEncoding(NSUTF8StringEncoding)

if let hd = htmlData {

flag = true

let path = NSTemporaryDirectory().stringByAppendingString(“index.html”)

try! NSFileManager.defaultManager().createDirectoryAtPath(path, withIntermediateDirectories: true, attributes: nil)

hd.writeToFile(path, atomically: true)

self.locUrl = NSURL(fileURLWithPath: path)

self.webView.loadHTMLString(hs, baseURL: self.locUrl)

self.webView.delegate = self

}

}

if !flag {

StyleHelper.showAlertWithTitle(“加载页面失败!”, doneText: “我知道了”, doneCallback: { (alert) -> (Void) in

alert.close()

})

self.navigationController?.popViewControllerAnimated(true)

}

另外两个思路:

1.获取html源码后,解析html文件,拿到img的src

NSXMLParser来处理

2.通过JavaScriptCore的JS与OC交互来处理

没有思路,本来是想用这种方法来处理的,感觉实现不了,不知道怎么拿到JSContent,也不知道怎么响应图片的点击事件,是可以写JS代码给img标签设置onclick,但是怎么拿到UIWebView的所有img标签呢?

上一篇下一篇

猜你喜欢

热点阅读