dav*_*vew 18 uimenucontroller ios wkwebview
我有一个WKWebView并希望从编辑菜单中删除系统菜单项(复制,定义,共享...)并显示我自己的.
我的目标是iOS 8和9.我目前正在使用Xcode 7.0.1模拟器(iOS 9)和运行iOS 9.0.2的iPhone 6进行测试.
我知道实现这一目标的标准方法是通过子类化WKWebView和实现
-canPerformAction:withSender:.但是,我发现WKWebView -canPerformAction:withSender:没有被称为copy:或define:行动.这似乎是一个已知的错误(WKWebView和UIMenuController).
示例应用程序:https://github.com/dwieringa/WKWebViewCustomEditMenuBug
@implementation MyWKWebView
- (BOOL)canPerformAction:(SEL)action withSender:(id)sender
{
NSLog(@"ACTION: %@", NSStringFromSelector(action));
if (action == @selector(delete:))
{
// adding Delete as test (works)
return YES;
}
// trying to remove everything else (does NOT work for Copy, Define, Share...)
return NO;
}
- (void)delete:(id)sender
{
NSLog(@"Delete menu item selected");
}
@end
Run Code Online (Sandbox Code Playgroud)
输出:(注意不行copy:或define:动作)
2015-10-20 12:28:32.864 WKWebViewCustomEditMenuBug[45804:21121480] ACTION: cut:
2015-10-20 12:28:32.865 WKWebViewCustomEditMenuBug[45804:21121480] ACTION: select:
2015-10-20 12:28:32.865 WKWebViewCustomEditMenuBug[45804:21121480] ACTION: selectAll:
2015-10-20 12:28:32.865 WKWebViewCustomEditMenuBug[45804:21121480] ACTION: paste:
2015-10-20 12:28:32.866 WKWebViewCustomEditMenuBug[45804:21121480] ACTION: delete:
2015-10-20 12:28:32.866 WKWebViewCustomEditMenuBug[45804:21121480] ACTION: _promptForReplace:
2015-10-20 12:28:32.866 WKWebViewCustomEditMenuBug[45804:21121480] ACTION: _transliterateChinese:
2015-10-20 12:28:32.867 WKWebViewCustomEditMenuBug[45804:21121480] ACTION: _showTextStyleOptions:
2015-10-20 12:28:32.907 WKWebViewCustomEditMenuBug[45804:21121480] ACTION: _addShortcut:
2015-10-20 12:28:32.908 WKWebViewCustomEditMenuBug[45804:21121480] ACTION: _accessibilitySpeak:
2015-10-20 12:28:32.908 WKWebViewCustomEditMenuBug[45804:21121480] ACTION: _accessibilitySpeakLanguageSelection:
2015-10-20 12:28:32.908 WKWebViewCustomEditMenuBug[45804:21121480] ACTION: _accessibilityPauseSpeaking:
2015-10-20 12:28:32.909 WKWebViewCustomEditMenuBug[45804:21121480] ACTION: makeTextWritingDirectionRightToLeft:
2015-10-20 12:28:32.909 WKWebViewCustomEditMenuBug[45804:21121480] ACTION: makeTextWritingDirectionLeftToRight:
Run Code Online (Sandbox Code Playgroud)
我现在的愿望是完全隐藏编辑菜单,并使用QBPopupMenu将其替换为自定义菜单.
我的问题是我无法找到隐藏或禁用标准编辑菜单的方法.我已经发现了一些建议,以隐藏它[UIMenuController sharedMenuController].menuVisible = NO;的UIMenuControllerWillShowMenuNotification,但我一直没能得到这个工作.它没有任何影响WillShowMenu.我可以隐藏它,DidShowMenu但到那时为时已晚,我得到一个菜单闪存.
我也试图在可见区域之外找到它[[UIMenuController sharedMenuController] setTargetRect:CGRectMake(0, 0, 1, 1) inView:self.extraView];,但是再次这样做WillShowMenu没有任何影响,DidShowMenu而且为时已晚.
这里有实验:https://github.com/dwieringa/WKWebViewEditMenuHidingTest
我错过了什么?是否有其他方法可以禁用或隐藏WKWebView的标准编辑菜单?
根据您的解决方法,我发现:
-(void)menuWillShow:(NSNotification *)notification
{
NSLog(@"MENU WILL SHOW");
dispatch_async(dispatch_get_main_queue(), ^{
[[UIMenuController sharedMenuController] setMenuVisible:NO animated:NO];
});
}
Run Code Online (Sandbox Code Playgroud)
将阻止菜单闪烁90%的时间..仍然不够好,但它是我们找到一个体面的解决方案之前的另一种解决方法.
尝试让您的视图控制器成为第一响应者并阻止它退出第一响应者
- (BOOL)canResignFirstResponder {
return NO;
}
- (BOOL)canBecomeFirstResponder {
return YES;
}
Run Code Online (Sandbox Code Playgroud)
https://github.com/dwieringa/WKWebViewEditMenuHidingTest/pull/1
我使用的一种方法是简单地使用 CSS 禁用菜单。CSS 属性称为-webkit-touch-callout: none;. 您可以将其应用于顶级元素,并对整个页面或任何子元素禁用它,并更精确地禁用它。希望有帮助。
| 归档时间: |
|
| 查看次数: |
5610 次 |
| 最近记录: |