起因

最近需要做个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长按保存图片的更多相关文章

  1. 升级xcode8之后出现报错提示,提示swift版本问题

    最近Xcode升级了,出现了各种蛋疼的错误提示,今天遇到个导入框架出现了提示Swift版本的问题,具体如下: "Use Legacy Swift Language Version" ...

  2. 窥探Swift系列博客说明及其Swift版本间更新

    Swift到目前为止仍在更新,每次更新都会推陈出新,一些Swift旧版本中的东西在新Swift中并不适用,而且新版本的Swift会添加新的功能.到目前为止,Swift为2.1版本.去年翻译的Swift ...

  3. CocoaPods 更新慢&swift版本适配

    一.更新慢的问题 使用CocoaPods来添加第三方类库,无论是执行pod install还是pod update都卡在了Analyzing dependencies不动 原因在于当执行以上两个命令的 ...

  4. wap2app(七)-- 长按保存图片

    用Hbuilder打包网站,在打包好的app中是无法像网站那样直接使用长按图片保存的功能的,需要在网站里对来自wap2app进行单独处理,接下来介绍一下如何在Hbuilder打包后的app里实现长按图 ...

  5. iOS swift版本无限滚动轮播图

    之前写过oc版本的无限滚动轮播图,现在来一个swift版本全部使用snapKit布局,数字还是pageConrrol样式可选 enum typeStyle: Int { case pageContro ...

  6. swift版本拼图游戏项目源码

    现学现做的第一个swift版本拼图游戏demo 常规模式,对换模式任你选择, 用到了花瓣的API,各种萌妹子~

  7. 查看MacOS中的Swift版本和SDK版本

    查看MacOS中的Swift版本和SDK版本 来源 https://juejin.im/post/5cde5a62f265da1bc55230e5 # 查看Swift版本 xcrun swift -v ...

  8. 最长公共子序列(Swift版本)

    class Mark {     var count: Int     var type: Int         init(count: Int, type: Int) {         self ...

  9. iOS UIWebview 长按图片,保存到本地相册

    我们所要解决的问题如题目所示:ios中,长按Webview中的图片,将图片保存到本地相册.解决方案:对load的html网页,执行js注入,通过在webview中执行js代码,来响应点击事件,通过js ...

随机推荐

  1. Java final和static 修饰符

    一.final final是不变的,最终的意思.可以用来修饰变量,方法,类. 1. 修饰变量 private final int a = 2; private final int b; // fina ...

  2. 把多种验证规则用到一个model上

    基于标记特性的Model验证,真的太棒了,与jquery validate结合后激情四射,有木有,一句话完成前后端验证.简直让人秒爱... 但是爱是爱了,生活中总会有些小摩擦,这不问题来了:看图中那个 ...

  3. win32绘图基础

     获取设备环境句柄: (1)WM_PAINT消息中: PAINTSTRUCT ps; HDC hdc = BeginPaint(hwnd,&ps); EndPaint(hwnd,&ps ...

  4. 开发者自建IM服务器必须要解决的几个问题!

    有很多朋友的项目需要用到即时通讯,几年前鄙人的项目也是如此,当年没有选择,只能自建了IM服务器,几年下来跨了不少的坑,想想都甚是后怕.总结此文为后来还想自建IM的朋友提个醒,或许能找到更好的解决之路. ...

  5. 【Android】进程间通信IPC——Binder

    Binder是Android中的跨进程通信方式,bindService的时候,服务端返回Binder对象,通过该对象客户端可以从服务端获取数据.在进程间通信IPC——AIDL中创建了ICustomAi ...

  6. SVN的一些操作

    一丶 .csproj文件夹必须提交 Revert Changes 撤销

  7. Django - ORM创建基本类

    DBFirst CodeFirst 创建类 1.根据类自动创建数据库表 在app下的models.py中创建表 创建数据库之前,需要在django下的setting.py模块中的INSTALLED_A ...

  8. Django REST framework 渲染器、版本

    渲染器.版本: # settings.py REST_FRAMEWORK = { "DEFAULT_RENDERER_CLASSES": [ "rest_framewor ...

  9. 第二节:Series基本属性及方法(下)

  10. Huawei-R&S-网络工程师实验笔记20190530-FTP上传下载、STelnet登录、SFTP登录

    >Huawei-R&S-网络工程师实验笔记20190530-FTP上传下载.STelnet登录.SFTP登录 >>实验开始,参考<Huawei-R&S-网络工程 ...