博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Swift4 0版 H5页面实现长按保存图片
阅读量:6257 次
发布时间:2019-06-22

本文共 2866 字,大约阅读时间需要 9 分钟。

Swift4.0版-H5页面实现长按保存图片

  • 刚开始拿到需求还是比较尴尬的,不会啊,没做过啊,是不是就尴尬了
  • 随即想了一下,好像微信里好多H5页面都有这样的功能
  • 然后查阅了一下相关资料,发现两行核心代码
//获取长按所在点let urlString = "document.elementFromPoint(\(touchPoint.x), \(touchPoint.y)).src"//根据该点的参数获取对应图片的链接let saveUrl = webView.stringByEvaluatingJavaScript(from: urlString)复制代码

下面来一起啊看一下完整的代码步骤

首先给UiWebView加一个长按手势

//添加长按手势let longPressGes = UILongPressGestureRecognizer(target: self, action: #selector(longPressedGesture(_:)))//一定要遵循代理longPressGes.delegate = selfwebView.addGestureRecognizer(longPressGes)复制代码

实现代理方法

//不实现该代理方法,长按无效//MARK: 手势代理方法extension SIWebViewController : UIGestureRecognizerDelegate{    func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool {        return true    }}复制代码

接着在手势响应方法里面实现相应的功能

注意:

  • 一定要判断手势的state属性
  • 判断saveUrl是否是一个nil值
@objc func longPressedGesture(recognizer: UILongPressGestureRecognizer){    if recognizer.state != .began { return }           let touchPoint = recognizer.location(in: webView)        //核心代码    let urlString = "document.elementFromPoint(\(touchPoint.x), \(touchPoint.y)).src"   if let saveUrl = webView.stringByEvaluatingJavaScript(from: urlString) {        //判断图片的链接是否为空,长度是否为o        if saveUrl.characters.count == 0 { return }        addAlertAction(saveUrl)    }}复制代码

调用保存图片功能按钮

fileprivate func addAlertAction(imageStr: String){        let alertV = UIAlertController()        let saveAction = UIAlertAction(title: "保存图片", style: .default) { (alertV) in            self.saveImageToDisk(imageStr)        }        //取消保存不作处理        let cancelAction = UIAlertAction(title: "取消", style: .cancel, handler: nil)                alertV.addAction(saveAction)        alertV.addAction(cancelAction)        controller.present(alertV, animated: true, completion: nil)}复制代码

使用SDWebImage保存图片

  • 注意使用SDWebImage的缓存机制
//保存图片    fileprivate func saveImageToDisk(_ imageStr: String){        guard let imageUrl = URL(string: imageStr) else { return }        let sdManager = SDWebImageManager.shared()                var image : UIImage!        if (sdManager?.diskImageExists(for: imageUrl))! {           //先从缓存中查找图片            image = sdManager?.imageCache.imageFromDiskCache(forKey: imageUrl.absoluteString)        }else{           //缓存中没有图片在进行网络下载            let data = try! Data(contentsOf: imageUrl)            image = UIImage(data: data)        }                //保存图片到相册中        UIImageWriteToSavedPhotosAlbum(image, self, #selector(self.image(_:didFinishSavingWithError:contextInfo:)), nil)    }复制代码

最后是一个保存成功与否的回调方法

@objc func image(_ image: UIImage, didFinishSavingWithError: NSError?, contextInfo: AnyObject){    if didFinishSavingWithError != nil {        MBProgressHUD.show(string: "请开启访问相册权限后使用此功能", inView: self.view)    } else {        MBProgressHUD.show(string: "图片保存成功", inView: self.view)    }}复制代码

以上如有不妥之处还望多多指正

转载地址:http://mxnsa.baihongyu.com/

你可能感兴趣的文章
python --- json模块和pickle模块详解
查看>>
说说一道实在很多陷阱的题
查看>>
EM算法
查看>>
jzoj p1306 河流
查看>>
关于JSBuilder2的使用.
查看>>
iPhone4S、iPad2即将完美越狱
查看>>
18windows_18_scrollBar滚动条
查看>>
本地推送
查看>>
Beta 冲刺 (7/7)
查看>>
区块链实现简单的电商交易(以太坊)
查看>>
VMware报错:"激活连接失败:No suitable device found for this connection."
查看>>
maven设置
查看>>
个人考场VIM配置
查看>>
adobe
查看>>
微信小程序中的分享事件
查看>>
HDU 6069 Counting Divisors【区间素筛】【经典题】【好题】
查看>>
使用HAXM为QEMU for Windows加速
查看>>
配置tomcat下war包可以自压缩
查看>>
idea中artifacts、facets、modules是什么意思?
查看>>
大数据下的Distinct Count(一):序
查看>>