【发布时间】:2011-10-04 07:38:10
【问题描述】:
当用户在 UIWebView 中长按时,会弹出一个复制和粘贴弹出窗口。是否可以禁用系统弹出复制和粘贴功能,但仍允许用户单击链接并转到新页面?
【问题讨论】:
标签: iphone uiwebview uigesturerecognizer
当用户在 UIWebView 中长按时,会弹出一个复制和粘贴弹出窗口。是否可以禁用系统弹出复制和粘贴功能,但仍允许用户单击链接并转到新页面?
【问题讨论】:
标签: iphone uiwebview uigesturerecognizer
您可以尝试将 javascript 注入 webView。此代码也适用于 iPhone,但仅在页面完全加载时才有效。 http://javascript.internet.com/page-details/disable-text-selection.html 或 http://solidlystated.com/scripting/proper-way-to-disable-text-selection-and-highlighting/
要使其在页面仅加载一半或仍在加载时正常工作,您可能必须使用与此类似的设置,在该设置中注入禁用 javascript,就像它开始选择一样。 http://www.icab.de/blog/2010/07/11/customize-the-contextual-menu-of-uiwebview/
UIWebView without Copy/Paste and selection rectangle when showing documents
【讨论】:
对于任何可以在 HTML 级别操作的人来说,JavaScript 解决方案是必经之路(从此处 [1] 提取 JavaScript 部分)。
对于无法修改 HTML 页面的开发人员,[1] 解决方案适用于 99% 的客户端,并且非常干净和安全。
但是对于长按链接或复制粘贴或放大镜等时出现的弹出窗口应该永远不会的情况,那么这就是我的工作解决方案。 (JavaScript 注入失败的情况是页面需要一些时间来加载并且用户在此期间长按链接)。
要解决这个问题,只需将此协议实现粘贴到代码中几乎任何地方(不要偷懒...创建一个新的类别文件)。请注意,这个解决方案是危险的,至少在理论上,在现实生活中(即从 iOS 6.0.2 开始)它并不危险。请了解哪些类别以及此解决方案涉及哪些内容。
@implementation UIScrollView (CustomGestureCollisionHandling)
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer{
for(UIView *aView in gestureRecognizer.view.subviews)
{
for (UIGestureRecognizer *gestRec in aView.gestureRecognizers)
{
if (!gestRec.enabled)
{
continue;
}
if ([[NSString stringWithFormat:@"%@",[gestRec class]] isEqualToString:@"UITapAndAHalfRecognizer"])
{
gestRec.enabled = NO;
}
}
}
if ([otherGestureRecognizer isKindOfClass:[UILongPressGestureRecognizer class]])
{
otherGestureRecognizer.enabled = NO;
}
return NO;
}
@end
【讨论】:
试试这个
[webView stringByEvaluatingJavaScriptFromString:@"document.body.style.webkitTouchCallout='none'; document.body.style.KhtmlUserSelect='none'"];
【讨论】:
- (void)webViewDidFinishLoad:(UIWebView *)webView {
[iWebView stringByEvaluatingJavaScriptFromString:@"document.body.style.webkitTouchCallout='none'; document.body.style.KhtmlUserSelect='none'"];
}
【讨论】:
在 iOS 5、6、7 中测试:
隐藏整个上下文菜单:
[[UIMenuController sharedMenuController] setMenuVisible:NO];
关于事件 UIMenuControllerWillShowMenuNotification
请注意,选择器会在延迟后再次触发。在示例中,他们使用 0.15 秒。我用的是 0.001。这样可以更好地防止外观 - 或者至少减少菜单可见/可用的时间。
【讨论】:
我希望这对你有用,因为它对我有用
- (void)webViewDidFinishLoad:(UIWebView *)webView
{
[webView stringByEvaluatingJavaScriptFromString:@"document.body.style.webkitTouchCallout='none';"];
[webView stringByEvaluatingJavaScriptFromString:@"document.body.style.webkitUserSelect='none';"];
}
【讨论】: