[英]How to add Pop up Button in UIWebView
當我在UIWebView
任何網址中長按音樂播放選項時,會打開deafult pop up。 我想在彈出窗口中添加一個按鈕..是否可以這樣做..
就像我想添加FETCH
按鈕一樣。
我可以在默認的彈出功能中進行更改,即OPEN
和COPY
。 如下所示
我通過谷歌來了解 -
首先,您實際上無法將其他菜單項添加到標准上下文菜單的默認菜單項中。 但您可以使用某個CSS屬性關閉上下文菜單。 所以解決方案是關閉默認菜單並從頭開始實現自己的菜單。 要實現自己的上下文菜單,您必須首先捕獲標簽並保持手勢,在屏幕上獲取手指的坐標,將這些坐標轉換為網頁的坐標系,最后在以下位置查找HTML元素這個位置。
新答案:
看起來這就是我們想要的,這里:
https://stackoverflow.com/a/3198220/700471
老答案:
好的,經過一些研究,這是交易:
您在問題中描述的內容似乎准確無誤:
首先,您實際上無法將其他菜單項添加到標准上下文菜單的默認菜單項中。 但您可以使用某個CSS屬性關閉上下文菜單。 所以解決方案是關閉默認菜單並從頭開始實現自己的菜單。 要實現自己的上下文菜單,您必須首先捕獲標簽並保持手勢,在屏幕上獲取手指的坐標,將這些坐標轉換為網頁的坐標系,最后在以下位置查找HTML元素這個位置。
所以你打算用上下文菜單實現你自己的popover控制器 - 很好,我根本不會涉及到這一點,我會假設你知道如何做到這一點。
您的問題似乎是,如何在UIWebView中進行長按手勢並將其轉換為網頁的坐標以查找所選的DOM元素,並將其用作生成彈出窗口的上下文菜單。
NSString *js = [NSString stringWithFormat:@"document.elementFromPoint(%f, %f).innerHTML", touchPoint.x, touchPoint.y];
看起來像JS你需要弄清楚什么元素剛被壓了,當然你需要做一些人物形象來看看它是否是一個鏈接並從那里執行你的上下文菜單,但那不是我調查過的東西。
進一步的想法:
可能最簡單的方法是將UILongPressGestureRecognizer
附加到UIWebView(這可以在nib中輕松完成),並確保“Sent Action”指向ViewController上的相應IBAction。 (我想你也可以使用委托出口,但我從來不需要這樣做。)
在任何情況下,您都可以使用手勢識別器的locationOfTouch:inView:方法,您可能想要使用的視圖將是UIWebView的內容視圖,我相信您可以使用myWebView.scrollView.subviews[0]
(或者objectAtIndex:變體,如果你沒有使用新的數組索引下標)。
無論如何,我想我已經提供了足夠的答案來回答你的問題。
編輯:
好的,所以你仍然遇到這個問題,所以我去做了一個測試項目並讓它運行起來。 有一點令人討厭的是,WebKit以某種方式在DOM中的對象周圍添加了一個“緩沖區”區域,這意味着如果你稍微觸摸鏈接旁邊它仍會突出顯示,但是當你使用JS命令elementFromPoint
它不會這樣做,所以你必須更仔細地觸摸以使用此方法觸發彈出窗口。 但是,它有效。
我使用“單一視圖”模板制作了一個空白項目,並將一個UIWebView
放入xib,將其delegate
出口指向File的所有者。 然后我將UILongPressGestureRecognizer
放入xib,附加到UIWebView。 我將其delegate
設置為文件所有者,並將其selector
出口設置為文件所有者中的longPressDetected
IBAction。 我還在Interface Builder的識別器屬性中取消選中“在視圖中取消”。
這是視圖控制器的代碼。
接口:
//
// WVTViewController.h
// WebViewTest
//
#import <UIKit/UIKit.h>
@interface WVTViewController : UIViewController <UIWebViewDelegate, UIGestureRecognizerDelegate>
@property (nonatomic, weak) IBOutlet UIWebView *myWebView;
@property (nonatomic) BOOL didFirstLoad;
- (IBAction)longPressDetected:(id)sender;
@end
執行:
//
// WVTViewController.m
// WebViewTest
//
#import "WVTViewController.h"
@interface WVTViewController ()
@end
@implementation WVTViewController
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
// Just load google.
NSURL *theURL = [NSURL URLWithString:@"http://www.google.com"];
NSURLRequest *request = [NSURLRequest requestWithURL:theURL];
[self.myWebView loadRequest:request];
}
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
- (void)webViewDidFinishLoad:(UIWebView *)webView
{
if (!self.didFirstLoad) {
// Disable the default contextual menu.
[webView stringByEvaluatingJavaScriptFromString:@"document.body.style.webkitTouchCallout='none';"];
}
}
// Called by the gesture recognizer.
- (IBAction)longPressDetected:(UILongPressGestureRecognizer *)sender
{
if (sender.state == UIGestureRecognizerStateBegan) {
NSLog(@"Long press detected.");
CGPoint webViewCoordinates = [sender locationInView:self.myWebView];
NSLog(@"WebView coordinates are: %@", NSStringFromCGPoint(webViewCoordinates));
// Find the DOM element
NSString *locatorString = [NSString stringWithFormat:@"document.elementFromPoint(%f, %f).innerHTML", webViewCoordinates.x, webViewCoordinates.y];
NSString *result = [self.myWebView stringByEvaluatingJavaScriptFromString: locatorString];
NSLog(@"Element Found: %@", result);
}
}
// Necessary or the gesture recognizer won't call the IBAction.
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
{
return YES;
}
@end
正如我所說,我測試了上面的代碼,它工作正常。 您當然可以更改您的JS並使用innerHTML
以外的其他內容,例如tagName
或href
或您喜歡的任何內容。 您可能需要進行多次檢查,可能需要使用排隊的JS命令(這將是蹩腳的),除非您可以JSON字符串化DOM對象,將其傳遞回Objective-C,轉換為本機對象和在那個環境中執行你的檢查 - 但是,我不是JS專業人員,我不打算調查那個。
作為一個注釋,我有點驚訝的是,對於elementFromPoint
的坐標是UIWebView本身內的觸摸坐標。 我編寫了一整段代碼,通過myWebView.scrollView.subviews
迭代,找到了內容視圖,然后在該視圖中調用了locationOfTouch:inView:
但是我得到了時髦的行為,所以在預感中我使用了webview坐標並且它工作得很好,即使在一個大的網頁上我滾動到一邊向下。 我懷疑webview中的某種Apple編程行為可能會轉換這些坐標。 可能是JS的坐標系根據內容視圖在滾動視圖內移動的方式而改變 - 這對我來說是最有意義的。
你可以用這樣的東西發射事件:
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
{
if( navigationType == UIWebViewNavigationTypeLinkClicked )
{
// Handle your URL click here (open the popup menu)
// ...
return NO;
}
return YES;
}
不要忘記委托UIWebView
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.