Swift版本UIWebView长按保存图片
起因
最近需要做个IOS的壳子,用到长按保存图片的功能,发现百度出来的全是OC语法的例子,很多都不是全面,只能自己写一份Swift版本的,图片下面附上Github地址
效果图

Github地址:https://github.com/goyuanfang/SwifLongTouchSavePic
原理
UIWebView中
func webViewDidFinishLoad(webView: UIWebView)
加载完URL后注入监听手机触摸屏幕的js脚本:
document.ontouchstart=function(event){
x=event.targetTouches[0].clientX;
y=event.targetTouches[0].clientY;
document.location="myweb:touch:start:"+x+":"+y;
};
document.ontouchmove=function(event){
x=event.targetTouches[0].clientX;
y=event.targetTouches[0].clientY;
document.location="myweb:touch:move:"+x+":"+y;};
document.ontouchcancel=function(event){
document.location="myweb:touch:cancel";
};
document.ontouchend=function(event){
document.location="myweb:touch:end";
};
每次监听到手指移动都会将修改document的页面定向,将参数传递给Swift的
webView(webView: UIWebView, shouldStartLoadWithRequest request: NSURLRequest, navigationType: UIWebViewNavigationType)
捕获到页面定向后分析参数,读取到img的src,弹出保存对话框
代码
enum TouchState {
case None
case Start
case Move
case End
case Cancel
}
//脚本触摸事件
static var touchJSStr:String = "document.ontouchstart=function(event){x=event.targetTouches[0].clientX;y=event.targetTouches[0].clientY;document.location=\"myweb:touch:start:\"+x+\":\"+y;};document.ontouchmove=function(event){x=event.targetTouches[0].clientX;y=event.targetTouches[0].clientY;document.location=\"myweb:touch:move:\"+x+\":\"+y;};document.ontouchcancel=function(event){document.location=\"myweb:touch:cancel\";};document.ontouchend=function(event){document.location=\"myweb:touch:end\";};"
static var imgUrl:String = ""//存储当前点击的图片路径
var touchState:TouchState = TouchState.None//设置默认的点击状态为NONE
var timer:NSTimer? = nil//定时器 长按时 定时器启动 执行一次 弹出保存确认
ViewController要继承UIWebViewDelegate,UIActionSheetDelegate
@IBOutlet weak var webView: UIWebView!
override func viewDidLoad() {
super.viewDidLoad()
webView.delegate = self
webView.loadRequest(NSURLRequest(URL: NSURL(string: "http://image.baidu.com")!))
}
func webView(webView: UIWebView, shouldStartLoadWithRequest request: NSURLRequest, navigationType: UIWebViewNavigationType) -> Bool{
let requestStr:String = request.URL!.absoluteString
let components = requestStr.componentsSeparatedByString(":")
if(components.count> && components[] == "myweb"){
if(components[] == "touch"){
if(components[] == "start"){
touchState = TouchState.Start
let ptX:Float32 = (components[] as NSString).floatValue
let ptY:Float32 = (components[] as NSString).floatValue
let js:String = "document.elementFromPoint(\(ptX), \(ptY)).tagName"
let tagName:String? = webView.stringByEvaluatingJavaScriptFromString(js)
if(tagName!.uppercaseString == "IMG")
{
let srcJS:String = "document.elementFromPoint(\(ptX), \(ptY)).src"
ViewController.imgUrl = srcJS
if(ViewController.imgUrl != ""){
timer = NSTimer.scheduledTimerWithTimeInterval(, target: self, selector: "handleLongTouch", userInfo: nil, repeats: false)
}
}
}else if(components[] == "move"){
touchState = TouchState.Move
if(timer != nil)
{
timer!.fire()
}
}
else if(components[] == "cancel"){
touchState = TouchState.Cancel
if(timer != nil)
{
timer!.fire()
}
}
else if(components[] == "end"){
touchState = TouchState.End
if(timer != nil)
{
timer!.fire()
}
}
}
}
return true
}
func webViewDidFinishLoad(webView: UIWebView){
webView.stringByEvaluatingJavaScriptFromString(ViewController.touchJSStr)//触摸js注册
}
//弹出保存对话框
func handleLongTouch(){
if(ViewController.imgUrl != "" && touchState == TouchState.Start){
var sheet:UIActionSheet = UIActionSheet(title: nil, delegate: self, cancelButtonTitle: "取消", destructiveButtonTitle: nil, otherButtonTitles: "保存图片")
sheet.cancelButtonIndex = sheet.numberOfButtons -
sheet.showInView(UIApplication.sharedApplication().keyWindow!)
}
}
//按钮点击保存 保存图片 需要实现 UIActionSheetDelegate
func actionSheet(actionSheet: UIActionSheet, clickedButtonAtIndex buttonIndex: Int){
if(buttonIndex == ){
let urlToSave:String? = self.webView.stringByEvaluatingJavaScriptFromString(ViewController.imgUrl)
let data:NSData? = NSData(contentsOfURL: NSURL(string: urlToSave!)!)
var image:UIImage? = UIImage(data: data!)
UIImageWriteToSavedPhotosAlbum(image!, self, "image:didFinishSavingWithError:contextInfo:", nil)
}
}
func image(image: UIImage, didFinishSavingWithError: NSError?, contextInfo: AnyObject) {
if didFinishSavingWithError != nil {
return
}
}
Swift版本UIWebView长按保存图片的更多相关文章
- 升级xcode8之后出现报错提示,提示swift版本问题
最近Xcode升级了,出现了各种蛋疼的错误提示,今天遇到个导入框架出现了提示Swift版本的问题,具体如下: "Use Legacy Swift Language Version" ...
- 窥探Swift系列博客说明及其Swift版本间更新
Swift到目前为止仍在更新,每次更新都会推陈出新,一些Swift旧版本中的东西在新Swift中并不适用,而且新版本的Swift会添加新的功能.到目前为止,Swift为2.1版本.去年翻译的Swift ...
- CocoaPods 更新慢&swift版本适配
一.更新慢的问题 使用CocoaPods来添加第三方类库,无论是执行pod install还是pod update都卡在了Analyzing dependencies不动 原因在于当执行以上两个命令的 ...
- wap2app(七)-- 长按保存图片
用Hbuilder打包网站,在打包好的app中是无法像网站那样直接使用长按图片保存的功能的,需要在网站里对来自wap2app进行单独处理,接下来介绍一下如何在Hbuilder打包后的app里实现长按图 ...
- iOS swift版本无限滚动轮播图
之前写过oc版本的无限滚动轮播图,现在来一个swift版本全部使用snapKit布局,数字还是pageConrrol样式可选 enum typeStyle: Int { case pageContro ...
- swift版本拼图游戏项目源码
现学现做的第一个swift版本拼图游戏demo 常规模式,对换模式任你选择, 用到了花瓣的API,各种萌妹子~
- 查看MacOS中的Swift版本和SDK版本
查看MacOS中的Swift版本和SDK版本 来源 https://juejin.im/post/5cde5a62f265da1bc55230e5 # 查看Swift版本 xcrun swift -v ...
- 最长公共子序列(Swift版本)
class Mark { var count: Int var type: Int init(count: Int, type: Int) { self ...
- iOS UIWebview 长按图片,保存到本地相册
我们所要解决的问题如题目所示:ios中,长按Webview中的图片,将图片保存到本地相册.解决方案:对load的html网页,执行js注入,通过在webview中执行js代码,来响应点击事件,通过js ...
随机推荐
- Mac sierra下 wget安装
本文由@ray 出品,转载请注明出处. 文章链接:http://www.cnblogs.com/wolfray/p/8040699.html 没有Wget的日子是非常难过的,强大的Mac OS 下安 ...
- BZOJ 4520: [Cqoi2016]K远点对 KDtree + 估价函数 + 堆
Code: #include<bits/stdc++.h> #define ll long long #define maxn 200000 #define inf 10000000000 ...
- 文本框、评论框原生js
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8 ...
- 通过git向github提交项目
按顺序学习 https://www.cnblogs.com/forget406/p/6045499.html#top https://blog.csdn.net/xiaoputao0903/artic ...
- 逆元Inv(模板+应用)
逆元: 如果满足公式,则有a 是 b的逆元同时b也是a的逆元. 逆元的应用: 设c为b在对m取余的意义下的逆元: 在求解公式 (a / b) % m的时候,如果b可能会非常的大,所以会出现爆精度的问题 ...
- BZOJ 1641 USACO 2007 Nov. Cow Hurdles 奶牛跨栏
[题解] 弗洛伊德.更新距离的时候把$f[i][j]=min(f[i][j],f[i][k]+f[k][j])$改为$f[i][j]=min(f[i][j],max(f[i][k],f[k][j])) ...
- E. Rusty String
E. Rusty String time limit per test 3 seconds memory limit per test 512 megabytes input standard inp ...
- EntityFramewordCore 2.2 DBFirst简单使用
如何用EF Core连接数据库并且生成实体类? 1.通过Nuget安装依赖 Install-package Microsoft.EntityFrameworkCore Install-package ...
- EXt js 学习笔记总结
1. get . fly. getCmp .getBody .getDoc .getDom.. get-----ExtJs获取节点.dom.提供缓存机制 Ext.Element类是Ext对DO ...
- windows下swoole安装教程
1)下载安装cygwin(根据操作系统选择32位或者64位): https://cygwin.com/install.html 选择在windows中虚拟环境的root目录 选择下载安装的网络节点,如 ...