美文网首页
长按UIWebView上的图片保存到相册

长按UIWebView上的图片保存到相册

作者: yaoyao_IOS | 来源:发表于2017-09-05 16:27 被阅读17次

    开发步骤 :

    1. 给UIWebView添加长按手势
    2. 监听手势动作,拿到坐标点(x,y)
    3. 弹出对话框,是否保存到相册
    4. UIWebView注入js:Document.elementFromPoint(x,y).src拿到img标签的src
    5. 拿到图片的url,生成UIImage
    6. 图片保存到相册
    //  WebView长按图片保存到相册
    #import "ViewController.h"
    
    @interface ViewController ()<
    UIGestureRecognizerDelegate,
    NSURLSessionDelegate>
    
    @property (weak, nonatomic) IBOutlet UIWebView *webView;
    @end
    
    
    @implementation ViewController
    
    #pragma mark -- life cycle
    - (void)viewDidLoad{
        [super viewDidLoad];
    
        NSString *htmlURL = [[NSBundle mainBundle] pathForResource:@"saveImage" ofType:@"html"];
        [self.webView loadRequest:[NSURLRequest requestWithURL:[NSURL fileURLWithPath:htmlURL]]];
       
        // 给UIWebView添加手势
        UILongPressGestureRecognizer* longPressed = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(longPressed:)];
        longPressed.delegate = self;
        [self.webView addGestureRecognizer:longPressed];
    }
    
    #pragma mark -- UIGestureRecognizerDelegate
    - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer{
        UIActivityTypeAddToReadingList
        return YES;
    }
    
    - (void)longPressed:(UILongPressGestureRecognizer*)recognizer{
        if (recognizer.state != UIGestureRecognizerStateBegan) {
            return;
        }
        CGPoint touchPoint = [recognizer locationInView:self.webView];
        NSString *imgURL = [NSString stringWithFormat:@"document.elementFromPoint(%f, %f).src", touchPoint.x, touchPoint.y];
        NSString *urlToSave = [self.webView stringByEvaluatingJavaScriptFromString:imgURL];
        if (urlToSave.length == 0) {
            return;
        }
    
        UIAlertController *alertVC =  [UIAlertController alertControllerWithTitle:@"提示" message:@"你真的要保存图片到相册吗?" preferredStyle:UIAlertControllerStyleAlert];
        UIAlertAction *okAction = [UIAlertAction actionWithTitle:@"确定" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
            [self saveImageToDiskWithUrl:urlToSave];
        }];
        UIAlertAction *cancelAction = [UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleDefault handler:nil];
        [alertVC addAction:okAction];
        [alertVC addAction:cancelAction];
        [self presentViewController:alertVC animated:YES completion:nil];
    }
    
    #pragma mark - private method
    - (void)saveImageToDiskWithUrl:(NSString *)imageUrl{
        
        NSURL *url = [NSURL URLWithString:imageUrl]
        NSURLSessionConfiguration * configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
        NSURLSession *session = [NSURLSession sessionWithConfiguration:configuration delegate:self delegateQueue:[NSOperationQueue new]];
    
        NSURLRequest *imgRequest = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestReturnCacheDataElseLoad timeoutInterval:30.0];
    
        NSURLSessionDownloadTask  *task = [session downloadTaskWithRequest:imgRequest completionHandler:^(NSURL * _Nullable location, NSURLResponse * _Nullable response, NSError * _Nullable error) {
            if (error) {
                return ;
            }
            NSData * imageData = [NSData dataWithContentsOfURL:location];
            dispatch_async(dispatch_get_main_queue(), ^{
    
                UIImage * image = [UIImage imageWithData:imageData];
                UIImageWriteToSavedPhotosAlbum(image, self, @selector(imageSavedToPhotosAlbum:didFinishSavingWithError:contextInfo:), NULL);
            });
        }];
        [task resume];
    }
    
    #pragma mark 保存图片后的回调
    - (void)imageSavedToPhotosAlbum:(UIImage*)image didFinishSavingWithError:  (NSError*)error contextInfo:(id)contextInfo{
        if(!error) {
            UIAlertController *alertControl = [UIAlertController alertControllerWithTitle:@"提示" message:@"成功保存到相册" preferredStyle:UIAlertControllerStyleAlert];
    
            UIAlertAction *action = [UIAlertAction actionWithTitle:@"确定" style:UIAlertActionStyleDestructive handler:nil];
            [alertControl addAction:action];
            [self presentViewController:alertControl animated:YES completion:nil];
        }else{
            UIAlertController *alertControl = [UIAlertController alertControllerWithTitle:@"提示" message:[error description] preferredStyle:UIAlertControllerStyleAlert];
            UIAlertAction *action = [UIAlertAction actionWithTitle:@"确定" style:UIAlertActionStyleCancel handler:nil];
            [alertControl addAction:action];
            [self presentViewController:alertControl animated:YES completion:nil];
        }
    }
    
    @end

    相关文章

      网友评论

          本文标题:长按UIWebView上的图片保存到相册

          本文链接:https://www.haomeiwen.com/subject/nlzujxtx.html