私が取り組んでいるアプリの一部として、ユーザーは Web からのダウンロードを含め、さまざまな場所から画像をインポートできる必要があります。アプリ内ブラウザを追加し、ユーザーが特定のアイテムを長押ししたときにさまざまなオプションを提示するコンテキスト メニューを含めました。
私のコードは Javascript を使用して HTML 要素のタグを検出し、次のチュートリアルと SO 投稿に基づいています。
http://www.icab.de/blog/2010/07/11/customize-the-contextual-menu-of-uiwebview/
UIWebView - <img> タグでアクション シートを有効にする
次のメソッドは、UILongPressGestureRecognizer によって呼び出されます。
(void)openContextMenuAt:(CGPoint)pt
{
// Load the JavaScript code from the Resources and inject it into the web page
NSString *path = [[NSBundle mainBundle] pathForResource:@"JSTools" ofType:@"js"];
NSString *jsCode = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:nil];
[self.webView stringByEvaluatingJavaScriptFromString: jsCode];
// get the Tags and URL at the touch location
NSString *tags = [self.webView stringByEvaluatingJavaScriptFromString:
[NSString stringWithFormat:@"MyAppGetHTMLElementsAtPoint(%i,%i);",(NSInteger)pt.x,(NSInteger)pt.y]];
NSString *elementURL = [self.webView stringByEvaluatingJavaScriptFromString:
[NSString stringWithFormat:@"MyAppGetLinkHREFAtPoint(%i,%i);", (NSInteger)pt.x, (NSInteger)pt.y]];
// create the UIActionSheet and populate it with buttons related to the tags
UIActionSheet *sheet = [[UIActionSheet alloc] initWithTitle:elementURL
delegate:self
cancelButtonTitle:nil
destructiveButtonTitle:nil
otherButtonTitles:nil];
BOOL shouldShowMenu = NO;
// If a link was touched, add link-related buttons
if ([tags rangeOfString:@",A,"].location != NSNotFound) {
[sheet addButtonWithTitle:NSLocalizedString(@"Open", nil)];
shouldShowMenu = YES;
}
// If an image was touched, add image-related buttons
if ([tags rangeOfString:@",IMG,"].location != NSNotFound) {
[sheet addButtonWithTitle:NSLocalizedString(@"Save Image", nil)];
shouldShowMenu = YES;
}
// check the item to see if it has an audio link attached
NSSet *validAudioExtensions = [NSSet setWithObjects:@"aiff", @"aac", @"alac", @"m4a", @"mp3", @"raw", @"wav", nil];
NSString *urlSuffix = [[elementURL pathExtension] lowercaseString];
if ([validAudioExtensions containsObject:urlSuffix]) {
[sheet addButtonWithTitle:@"Save Audio"];
shouldShowMenu = YES;
}
// Add buttons which should be always available
[sheet addButtonWithTitle:NSLocalizedString(@"Open in Safari", nil)];
if (shouldShowMenu == YES)
{
CGRect menuTarget = CGRectMake(pt.x, pt.y, 1, 1);
[sheet setActionSheetStyle:UIActionSheetStyleBlackOpaque];
[sheet showFromRect:menuTarget inView:self.webView animated:YES];
}
}
最近まで、これは私がテストしたほぼすべてのサイトで完全に機能していました。ただし、Google の画像検索 (残念ながら、ほとんどのユーザーがおそらく最初に検索する場所) には対応していません。
メインの検索結果 (画像のサムネイル付き) で、IMG タグを検出し、サムネイル画像をダウンロードできます。ただし、サムネイルをタップして大きなフルサイズの画像を表示すると、何を押しているかを検出できなくなります。さらに、どちらのビューからも URL を取得できません (URL を印刷しても空の文字列しか表示されませんでした)。
どの要素が押されたかを検出するための代替のより良い方法はありますか? Google で使用する必要がある特定の回避策はありますか?
よろしくお願いします。