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
#import "UnpreventableUILongPressGestureRecognizer.h" @implementation UnpreventableUILongPressGestureRecognizer- (BOOL)canBePreventedByGestureRecognizer:(UIGestureRecognizer *)preventedGestureRecognizer { return NO;}@end
UnpreventableUILongPressGestureRecognizer *longPressRecognizer = [[UnpreventableUILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(handleLongPress:)];longPressRecognizer.allowableMovement = 20;longPressRecognizer.minimumPressDuration = 1.0f;[webview addGestureRecognizer:longPressRecognizer];
-(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]; }}
#import <foundation foundation.h="">@interface UIWebView(WebViewAdditions)- (CGSize)windowSize;- (CGPoint)scrollOffset;@end</foundation>
#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
- (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]; } }
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;}
#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];}