требование
У меня есть WKWebView
и я хочу удалить элементы системного меню (Копировать, Определить, Поделиться...) из меню Правка и представить свои собственные.
Я ориентируюсь на iOS 8 и 9. В настоящее время я тестирую симулятор Xcode 7.0.1 (iOS 9) и мой iPhone 6 под управлением iOS 9.0.2.
Стандартный метод не работает
Я знаю, что стандартным способом достижения этого является WKWebView
подкласса 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
имеет никакого WillShowMenu
, а с DidShowMenu
уже слишком поздно.
Эксперименты доступны здесь: https://github.com/dwieringa/WKWebViewEditMenuHidingTest
Что мне не хватает? Есть ли другой способ отключить или скрыть стандартное меню редактирования для WKWebView?