Требование
У меня есть WKWebView
, и я хотел бы удалить элементы системного меню (Копировать, Определить, Поделиться...) из меню «Правка» и представить свои собственные.
Я нацелен на iOS 8 и 9. В настоящее время я тестирую симулятор Xcode 7.0.1 (iOS 9) и мой iPhone 6 под управлением iOS 9.0.2.
Стандартный метод не работает
Я знаю, что стандартный способ добиться этого — создать подкласс 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
Выход: (обратите внимание на отсутствие действия 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:
Запланированное обходное решение
Теперь я хочу полностью скрыть меню редактирования и заменить его пользовательским меню с помощью 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?