`
zl4393753
  • 浏览: 340238 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

UIWebView长按图片生成保存菜单

 
阅读更多
UIWebView长按图片生成保存菜单
参考:
http://www.icab.de/blog/2010/07/11/customize-the-contextual-menu-of-uiwebview/
http://www.icab.de/blog/2011/10/17/elementfrompoint-under-ios-5/comment-page-1/#comment-30184

自定义UILongPressGestureRecognizer
创建 UnpreventableUILongPressGestureRecognizer.h
#import <Foundation/Foundation.h>
@interface UnpreventableUILongPressGestureRecognizer : UILongPressGestureRecognizer {
}
@end


UnpreventableUILongPressGestureRecognizer.m
#import "UnpreventableUILongPressGestureRecognizer.h"
 
@implementation UnpreventableUILongPressGestureRecognizer
- (BOOL)canBePreventedByGestureRecognizer:(UIGestureRecognizer *)preventedGestureRecognizer {
    return NO;
}
@end


UIWebview页面给webview添加手势 ViewController.m:
UnpreventableUILongPressGestureRecognizer *longPressRecognizer = [[UnpreventableUILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(handleLongPress:)];
longPressRecognizer.allowableMovement = 20;
longPressRecognizer.minimumPressDuration = 1.0f;
[webview addGestureRecognizer:longPressRecognizer];


ViewController.m 处理手势:
-(void)handleLongPress:(UILongPressGestureRecognizer *)gestureRecognizer
{
    if (gestureRecognizer.state == UIGestureRecognizerStateBegan) {
         
        CGPoint pt = [gestureRecognizer locationInView:self.webview];
         
        // convert point from view to HTML coordinate system
        // 뷰의 포인트 위치를 HTML 좌표계로 변경한다.
        CGSize viewSize = [webview frame].size;
        CGSize windowSize = [webview windowSize];
        CGFloat f = windowSize.width / viewSize.width;
 
        if ([[[UIDevice currentDevice] systemVersion] doubleValue] >= 5.0) {
            pt.x = pt.x * f;
            pt.y = pt.y * f;
        } else {
            // On iOS 4 and previous, document.elementFromPoint is not taking
            // offset into account, we have to handle it
            CGPoint offset = [webview scrollOffset];
            pt.x = pt.x * f + offset.x;
            pt.y = pt.y * f + offset.y;
        }
         
        [self openContextualMenuAt:pt];
    }
}


创建分类 WebViewAdditions.h
#import <foundation foundation.h="">
@interface UIWebView(WebViewAdditions)
- (CGSize)windowSize;
- (CGPoint)scrollOffset;
@end
</foundation>


WebViewAdditions.m
#import "WebViewAdditions.h"
 
@implementation UIWebView(WebViewAdditions)
 
- (CGSize)windowSize
{
    CGSize size;
    size.width = [[self stringByEvaluatingJavaScriptFromString:@"window.innerWidth"] integerValue];
    size.height = [[self stringByEvaluatingJavaScriptFromString:@"window.innerHeight"] integerValue];
    return size;
}
 
- (CGPoint)scrollOffset
{
    CGPoint pt;
    pt.x = [[self stringByEvaluatingJavaScriptFromString:@"window.pageXOffset"] integerValue];
    pt.y = [[self stringByEvaluatingJavaScriptFromString:@"window.pageYOffset"] integerValue];
    return pt;
}
@end


弹出菜单 ViewController.m
- (void)openContextualMenuAt:(CGPoint)pt{
    // Load the JavaScript code from the Resources and inject it into the web page
    NSBundle *bundle = [NSBundle bundleWithPath:[[NSBundle mainBundle] pathForResource:@"Naving" ofType:@"bundle"]];
    NSString *path = [bundle pathForResource:@"JSTools" ofType:@"js"];
    NSString *jsCode = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:nil];
    [webview stringByEvaluatingJavaScriptFromString:jsCode];
     
    // get the Tags at the touch location
    NSString *tags = [webview stringByEvaluatingJavaScriptFromString:
                      [NSString stringWithFormat:@"MyAppGetHTMLElementsAtPoint(%i,%i);",(NSInteger)pt.x,(NSInteger)pt.y]];
     
    NSString *tagsHREF = [webview stringByEvaluatingJavaScriptFromString:
                          [NSString stringWithFormat:@"MyAppGetLinkHREFAtPoint(%i,%i);",(NSInteger)pt.x,(NSInteger)pt.y]];
     
    NSString *tagsSRC = [webview stringByEvaluatingJavaScriptFromString:
                         [NSString stringWithFormat:@"MyAppGetLinkSRCAtPoint(%i,%i);",(NSInteger)pt.x,(NSInteger)pt.y]];
     
    NSLog(@"tags : %@",tags);
    NSLog(@"href : %@",tagsHREF);
    NSLog(@"src : %@",tagsSRC);
     
    if (!_actionActionSheet) {
        _actionActionSheet = nil;
    }
    _actionActionSheet = [[UIActionSheet alloc] initWithTitle:nil
                                                       delegate:self
                                              cancelButtonTitle:nil
                                         destructiveButtonTitle:nil
                                              otherButtonTitles:nil];
     
    selectedLinkURL = @"";
    selectedImageURL = @"";
     
    // If an image was touched, add image-related buttons.
    if ([tags rangeOfString:@",IMG,"].location != NSNotFound) {
        selectedImageURL = tagsSRC;
         
        if (_actionActionSheet.title == nil) {
            _actionActionSheet.title = tagsSRC;
        }
         
        [_actionActionSheet addButtonWithTitle:@"Save Image"];
        [_actionActionSheet addButtonWithTitle:@"Copy Image"];
    }
    // If a link is pressed add image buttons.
    if ([tags rangeOfString:@",A,"].location != NSNotFound){
        selectedLinkURL = tagsHREF;
         
        _actionActionSheet.title = tagsHREF;
        [_actionActionSheet addButtonWithTitle:@"Open Link"];
        [_actionActionSheet addButtonWithTitle:@"Copy Link"];
    }
     
    if (_actionActionSheet.numberOfButtons > 0) {
        [_actionActionSheet addButtonWithTitle:@"Cancel"];
        _actionActionSheet.cancelButtonIndex = (_actionActionSheet.numberOfButtons-1);
         
         
        [_actionActionSheet showInView:webview];
    }
     
}


工具文件 JSTools.js
function MyAppGetHTMLElementsAtPoint(x,y) {
    var tags = ",";
    var e = document.elementFromPoint(x,y);
    while (e) {
        if (e.tagName) {
            tags += e.tagName + ',';
        }
        e = e.parentNode;
    }
    return tags;
}
 
function MyAppGetLinkSRCAtPoint(x,y) {
    var tags = "";
    var e = document.elementFromPoint(x,y);
    while (e) {
        if (e.src) {
            tags += e.src;
            break;
        }
        e = e.parentNode;
    }
    return tags;
}
 
function MyAppGetLinkHREFAtPoint(x,y) {
    var tags = "";
    var e = document.elementFromPoint(x,y);
    while (e) {
        if (e.href) {
            tags += e.href;
            break;
        }
        e = e.parentNode;
    }
    return tags;
}


ViewController.m 处理ActionSheet事件
#pragma UIActionSheetDelegate
-(void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex{
    if ([[actionSheet buttonTitleAtIndex:buttonIndex] isEqualToString:@"Open Link"]){
        [webview loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:selectedLinkURL]]];
    }
    else if ([[actionSheet buttonTitleAtIndex:buttonIndex] isEqualToString:@"Copy Link"]){
        [[UIPasteboard generalPasteboard] setString:selectedLinkURL];
    }
    else if ([[actionSheet buttonTitleAtIndex:buttonIndex] isEqualToString:@"Copy Image"]){
        [[UIPasteboard generalPasteboard] setString:selectedImageURL];
    }
    else if ([[actionSheet buttonTitleAtIndex:buttonIndex] isEqualToString:@"Save Image"]){
        NSOperationQueue *queue = [NSOperationQueue new];
        NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self
                                                                                selector:@selector(saveImageURL:) object:selectedImageURL];
        [queue addOperation:operation];
        //[operation release];
    }
}
 
-(void)saveImageURL:(NSString*)url{
    [self performSelectorOnMainThread:@selector(showStartSaveAlert) 
                           withObject:nil
                        waitUntilDone:YES];
     
    UIImageWriteToSavedPhotosAlbum([UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:url]]], nil, nil, nil);
     
    [self performSelectorOnMainThread:@selector(showFinishedSaveAlert)
                           withObject:nil
                        waitUntilDone:YES];
}




分享到:
评论

相关推荐

    UIWebView中加载本地图片

    然而,当我们要在UIWebView中加载本地图片时,就需要对这个过程做一些特别的处理。这篇教程将详细解释如何在UIWebView中加载本地图片,并提供一个实例代码来帮助理解。 首先,我们需要了解UIWebView的基本用法。...

    获取UIWebVIew里的图片的demo

    这篇教程将详细介绍如何在Objective-C中实现“获取UIWebView里的图片”的操作。 首先,我们要明白UIWebView与JavaScript的交互机制。UIWebView提供了一个名为`stringByEvaluatingJavaScriptFromString:`的方法,...

    UIWebView的cookie读取与保存

    本文将详细讲解如何在UIWebView中进行Cookie的读取与保存。 首先,理解Cookie的基本概念。Cookie是由服务器发送到用户的浏览器并存储在本地的小型文本文件,用于在用户与服务器之间维持状态。当用户再次请求同一...

    iOS UIWebView URL拦截.pdf

    但是,UIWebView本身并不支持直接加载本地资源。为了实现这一需求,文中提出了通过URL拦截的方法来解决。 首先,我们需要了解iOS中的URL Loading System,这是一个系统级别的网络请求框架,UIWebView正是利用这个...

    UIWebView的使用代码

    默认情况下,长按web页面中的链接,系统会自动呼出菜单提供open,copy和cancel选项,但如果要实现触击链接跳转至safari中打开页面该怎么做呢?UIWebViewDelegate协议中,包含 ? 1 - (BOOL)webView:(UIWebView *)...

    UIWebViewDemo

    4. **返回上页功能**: 要实现"返回上页"的功能,需要保存每个页面的`UIWebView`的历史记录。当用户点击“返回”按钮时,调用`goBack()`方法: ```swift if webView.canGoBack { webView.goBack() } ``` 5. **在...

    IOS UIWebView Demo

    【标题】:“IOS UIWebView Demo”是一个iOS应用开发中的实例,它主要展示了如何在iOS应用中集成和使用UIWebView组件来加载和展示网页内容。UIWebView是Apple iOS SDK提供的一种原生控件,用于在iOS应用程序内部显示...

    UIWebView+html+css

    一种常见方法是将GIF转换为一系列静态图片,然后用JavaScript动态切换图片来模拟动画效果。另一种方法是使用第三方库,如`SDWebImage`,它可以自动处理GIF动图并在UIWebView中显示。 五、HSWebViewSample ...

    iPhone开发之UIWebView示例程序

    在iOS应用开发中,UIWebView是一个非常重要的组件,它允许开发者在应用程序内嵌入网页内容,实现网页浏览功能。这个示例程序是针对iPhone平台,旨在帮助开发者理解如何有效地使用UIWebView来展示网页数据。通过这个...

    UIWebView实现图文混排

    当需要在应用中实现图文混排时,UIWebView是一个非常实用的选择,因为它能够轻松地将文字和图片结合在一起显示。本篇文章将详细探讨如何利用UIWebView来实现这一功能。 首先,我们需要理解图文混排的基本概念。图文...

    UIWebView和js交互

    在iOS开发中,UIWebView是苹果提供的一种原生控件,用于展示网页内容。它可以加载HTML、CSS和JavaScript代码,并且支持与JavaScript进行交互,从而实现原生应用和Web内容的融合。本教程将深入探讨UIWebView与...

    UIWebView的使用

    在iOS开发中,UIWebView是苹果提供的一种非常重要的组件,它允许开发者在应用程序内部嵌入网页内容,实现类似浏览器的功能。这个"UIWebView的使用"示例是一个基础的学习项目,旨在帮助开发者理解如何通过UIWebView...

    UIWebView使用

    在iOS开发中,UIWebView是苹果提供的一种非常重要的组件,用于在原生应用中嵌入网页内容。这个组件使得开发者可以展示HTML、CSS和JavaScript编写的网页,甚至与应用程序进行交互,实现一定的混合开发模式。以下是对...

    UIWebView和js交互demo1

    在iOS开发中,UIWebView是苹果提供的一种原生控件,用于展示网页内容。它可以加载HTML、CSS和JavaScript代码,并且具有与Objective-C(OC)代码进行交互的能力。本项目"UIWebView和js交互demo1"就是展示了如何利用...

    网页视图 UIWebView

    在本文中,我们将深入探讨UIWebView的基本使用,包括网络资源地址字符串的处理以及UIWebView的属性和协议的综合应用。 首先,让我们了解一下**UIWebView的基本使用**。创建一个UIWebView实例很简单,只需要在代码中...

    Cocos2dx中UIWebView替换为WKWebView

    然而,随着Apple对App Store审核政策的调整,使用UIWebView的App将不再被接受,因为Apple已经将其列为弃用API。在2020年,Apple明确表示,自2020年12月起,所有新提交的App和更新都必须移除UIWebView的使用,转而...

    UIWebView与 javascript的交互

    在iOS开发中,UIWebView是苹果提供的一种原生控件,用于在应用内展示网页内容。这个"UIWebView与javascript的交互"的标题暗示了我们正在探讨如何在iOS应用中利用UIWebView与嵌入的HTML页面进行双向通信,即通过...

    UIWebView加载html

    在iOS开发中,UIWebView是苹果提供的一种用于在应用程序中展示网页内容的组件。这篇博客“UIWebView加载html”很可能是讨论如何利用UIWebView来加载并显示HTML代码,这对于构建混合式应用或者需要在App内嵌入网页...

    UIWebView原生与H5交互

    在iOS开发中,UIWebView是苹果提供的一种组件,用于在应用程序中展示网页内容。它不仅可以加载HTML页面,还可以执行JavaScript代码,甚至与原生代码进行交互。这种交互性使得开发者可以利用HTML、CSS和JavaScript的...

Global site tag (gtag.js) - Google Analytics