如何在UIWebView中添加弹出按钮

Sam*_*one 5 iphone popup uiwebview ios

当我长按任何网址中的音乐播放选项时,会打开聋人弹出窗口UIWebView.我想在弹出窗口中添加一个按钮..是否可以这样做..

就像我想添加FETCH按钮一样.

我可以在默认弹出功能中进行更改,这是OPENCOPY.如下所示

在此输入图像描述

我通过谷歌来了解 -

首先,您实际上无法将其他菜单项添加到标准上下文菜单的默认菜单项中.但您可以使用某个CSS属性关闭上下文菜单.所以解决方案是关闭默认菜单并从头开始实现自己的菜单.要实现自己的上下文菜单,您必须首先捕获标签并保持手势,在屏幕上获取手指的坐标,将这些坐标转换为网页的坐标系,最后在以下位置查找HTML元素这个位置.

Mat*_* Mc 5

新答案:

看起来这就是我们想要的,这里:

/sf/answers/223875431/

老答案:

好的,经过一些研究,这是交易:

您在问题中描述的内容似乎准确无误:

首先,您实际上无法将其他菜单项添加到标准上下文菜单的默认菜单项中.但您可以使用某个CSS属性关闭上下文菜单.所以解决方案是关闭默认菜单并从头开始实现自己的菜单.要实现自己的上下文菜单,您必须首先捕获标签并保持手势,在屏幕上获取手指的坐标,将这些坐标转换为网页的坐标系,最后在以下位置查找HTML元素这个位置.

所以你打算用上下文菜单实现你自己的popover控制器 - 很好,我根本不会涉及到这一点,我会假设你知道如何做到这一点.

您的问题似乎是,如何在UIWebView中进行长按手势并将其转换为网页的坐标以查找所选的DOM元素,并将其用作生成弹出窗口的上下文菜单.

但是我发现了这个,特别是与这行代码:

NSString *js = [NSString stringWithFormat:@"document.elementFromPoint(%f, %f).innerHTML", touchPoint.x, touchPoint.y];
Run Code Online (Sandbox Code Playgroud)

看起来像JS你需要弄清楚什么元素刚被压了,当然你需要做一些人物形象来看看它是否是一个链接并从那里执行你的上下文菜单,但那不是我调查过的东西.

进一步的想法:

可能最简单的方法是将UILongPressGestureRecognizerUI 附加到UIWebView(这可以在笔尖中轻松完成),并确保"已发送操作"指向ViewController上的相应IBAction.(我想你也可以使用委托出口,但我从来不需要这样做.)

在任何情况下,您都可以使用手势识别器的locationOfTouch:inView:方法,您可能想要使用的视图将是UIWebView的内容视图,我相信您可以使用类似的东西myWebView.scrollView.subviews[0](或者objectAtIndex:变体if)你没有使用新的数组索引下标).

无论如何,我想我已经提供了足够的答案来回答你的问题.


编辑:

好的,所以你仍然遇到这个问题,所以我去做了一个测试项目并让它运行起来.有一点令人讨厌的是,WebKit以某种方式在DOM中的对象周围添加了一个"缓冲区"区域,这意味着如果你稍微触摸链接旁边它仍然会突出显示,但是当你使用JS命令elementFromPoint它不会这样做,所以你必须更仔细地触摸使用此方法触发弹出窗口.但是,它有效.

我使用"单一视图"模板制作了一个空白项目,并将其UIWebView插入xib,将其delegate出口指向文件所有者.然后我把一个UILongPressGestureRecognizer放入xib,附加到UIWebView.我将其设置delegate为文件所有者,并将其selector出口设置为文件所有者中的longPressDetectedIBAction.我还在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
Run Code Online (Sandbox Code Playgroud)

执行:

//
//  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
Run Code Online (Sandbox Code Playgroud)

正如我所说,我测试了上面的代码,它工作正常.当然,你可以改变你的JS和使用比其他的东西innerHTML,比如tagNamehref或任何你喜欢的.您可能需要进行多次检查,可能需要使用排队的JS命令(这将是蹩脚的),除非您可以JSON字符串化DOM对象,将其传递回Objective-C,转换为本机对象和在那个环境中执行你的检查 - 但是,我不是JS专业人员,我不会去调查那个.

作为一个注释,我有点惊讶的是,用于elementFromPoint的坐标是UIWebView本身内的触摸坐标.我编写了一整段代码,迭代完成myWebView.scrollView.subviews并找到内容视图,然后调用locationOfTouch:inView:该视图.但是我得到了时髦的行为,所以在预感中我使用了webview坐标并且它工作得很好,即使在一个大的网页上我滚动到一边向下也是如此.我怀疑webview中的某种Apple编程行为可能会转换这些坐标.可能是JS的坐标系根据内容视图在滚动视图内移动的方式而改变 - 这对我来说是最有意义的.