Swift4.2 实现长按WebView中的图片保存到相册

29 篇文章 1 订阅
27 篇文章 0 订阅

最近项目中需求需要保存webview中的图片,通过长按来实现弹出提示保存。

具体实现如下:

注意由于该功能需要往相册存图片,所以需要相册的写权限。需在plist文件中加入 Privacy - Photo Library Additions Usage Description 键值对。

func addLongPressGes() {
        //添加长按手势
        let longPressGes = UILongPressGestureRecognizer(target: self, action: #selector(longPressedGesture(recognizer:)))
        //一定要遵循代理
        longPressGes.delegate = self
        webView.addGestureRecognizer(longPressGes)
    }
    
    @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.count == 0 { return }
            addAlertAction(imageStr: 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)
        self.present(alertV, animated: true, completion: nil)
    }
    
    //保存图片  这里使用了SDWebImage的缓存机制
    fileprivate func saveImageToDisk(_ imageStr: String){
        guard let imageUrl = URL(string: imageStr) else { return }
        let sdManager = SDWebImageManager.shared()
        
        var image : UIImage!
        sdManager.cachedImageExists(for: imageUrl) { (isExists) in
            if isExists {
                //先从缓存中查找图片
                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 {
            Toast(text: "请开启访问相册权限后使用此功能").show()
        } else {
            Toast(text: "图片保存成功").show()  //此处的Toast是使用的一个封装的Toast弹框库,具体可按自己的需求进行提示显示。
        }
    }

 

注意下面的代理方法必须实现:

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

调用方法:

直接调用addLongPressGes()方法即可。

本文参考文献地址:https://www.jianshu.com/p/b1073b79d7ea ,在其基础上做了部分代码修改。

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值