我正在开发一个 iPhone 应用程序并使用 UIWebViews。我计划自定义在 UiWebView 中突出显示字符串时弹出的 UIMenuItems(复制、全选、剪切等)。我尝试删除这些 menuItems,但我无法删除 COPY 菜单项。
我需要你们的帮助。
谢谢,ZaldzBugz
我正在开发一个 iPhone 应用程序并使用 UIWebViews。我计划自定义在 UiWebView 中突出显示字符串时弹出的 UIMenuItems(复制、全选、剪切等)。我尝试删除这些 menuItems,但我无法删除 COPY 菜单项。
我需要你们的帮助。
谢谢,ZaldzBugz
你将不得不做一些劫持。我什至不知道这是否可能。看起来它可能响应了一个名为 UILongPressGestureRecognizer 的手势事件。
您需要找出在哪个视图中添加了手势。像这样的东西。
NSArray *gestures = myWebView.gestureRecognizers;
for(int i=0;i<[gestures count];i++){
UIGestureRecognizer g = [gestures objectAtIndex:i];
if([g isKindOfClass:UILongPressGestureRecognizer.Class]){
[myWebView removeGestureRecognizer:g];
break;
}
}
但我不认为手势直接在 UIWebview 上。它位于其子视图之一。
所以它可能在这个子视图上
UIScrollView *sview = [[mywebview subviews] objectAtIndex:0];
如果不是那个,那么它可能是最重要的视图,这是我怀疑的。它是一种未记录的 View 类型,但如果您将其视为我们正在调用的方法的 UIView,它可能是安全的。另外,因为您将其视为 UIView,所以据我了解,它并不违反规则。
UIScrollView *sview = [[mywebview subviews] objectAtIndex:0];
UIView *realWebView = [[sview subviews] objectAtIndex:10];
我没有编写代码片段(未经测试)来尝试从所有视图中删除手势的原因是因为知道从哪个视图中删除它很重要。
删除后,您需要编写自己的 UILongPressGestureRecognizer,然后将新的添加到相应的视图(从中删除它的视图)。
您已经失去了复制选择等的所有功能......但现在您可以实现自己的功能。
如果您想要一些旧功能,我想我知道您可以如何取回它,但我不能保证这是允许的或安全的。
在删除手势之前,您需要覆盖 UIView 的方法。您应该能够在当前的工作类文件中执行此操作(在文件顶部)
@implementation UIView (extended)
-(BOOL) respondsToSelector:(SEL)aSelector {
printf("SELECTOR: %s\n",
[NSStringFromSelector(aSelector) UTF8String]);
return [super respondsToSelector:aSelector];
}
@end
我不能保证任何事情,但这应该记录在您的视图中调用的每个方法的名称。
运行您的应用程序并执行复制、粘贴、选择、选择所有方法。您的日志应该显示当您按下按钮时调用了哪些方法。当您按下按钮时,它可能会显示几种方法,您可能只想要第一种。
现在,当您创建 menuItem 时,您知道要分配给它的选择器。
这一切都只是猜测。希望能帮助到你。
我在this answer中使用了类似问题的技术,它可以消除复制菜单项。也就是说,在他们的示例中覆盖 UIWebView 而不是 UITextView 。还写了一个 canPerformAction:withSender: 在视图控制器中,它为我的自定义选择器返回 YES,为 copy: 选择器返回 NO,如果选择器不是这些,则返回超级实现的值。请记住在您的 xib 中设置自定义 UIWebView 子类名称。