Как отключить увеличительное стекло в UIWebview?
Как я могу отключить увеличительное стекло, которое появляется, когда вы удерживаете прикосновение к UIWebView? Я не хочу отключать взаимодействие с пользователем, но не хочу, чтобы веб-просмотр показывал это стекло зума. Есть идеи?
5 ответов
Нет, лупа неразрывно связана с выбором. Чтобы отключить его, вам придется полностью отключить выбор (вы можете использовать -webkit-user-select: none
сделать это).
Поскольку принятое решение у меня не сработало, мне пришлось искать другие варианты, и я нашел один.
Обратите внимание, что я не знаю, одобряет ли Apple эту технику. Используйте это на свой страх и риск.
(Наши не были отклонены; я не думаю, что Apple беспокоится о том, что вы возитесь с UIWebView
внутренности, но будьте осторожны.)
Я рекурсивно спустился UIWebView
подпредставления и перечислять их gestureRecognizers
, Всякий раз, когда я сталкиваюсь с UILongPressGestureRecognizer
Я поставил ее enabled
в NO
,
Это полностью избавляет от увеличительного стекла и, очевидно, отключает любую функцию долгого нажатия по умолчанию.
Кажется, что iOS повторно включает (или заново создает) эти распознаватели жестов всякий раз, когда пользователь начинает редактировать текст.
Ну, я не против использовать увеличительное стекло в текстовых полях, поэтому я не отключаю их сразу.
Вместо этого я жду blur
событие на моих текстовых элементах, и когда это происходит, я снова обхожу дерево подпредставления.
Все просто, и это работает.
Потому что я не знаю, как использовать -webkit-user-select: none
Я искал другие пути. И я наткнулся на это Настроить контекстное меню UIWebView, а затем я объединил его с -webkit-user-select: none
,
- (void)webViewDidFinishLoad:(UIWebView *)webView
{
[webView stringByEvaluatingJavaScriptFromString:@"document.body.style.webkitUserSelect='none';"];
}
Я обнаружил, что -webkit-user-select: none;
один не делает трюк. Вместо этого я нашел довольно недокументированное свойство -webkit-touch-callout
Что я обычно делаю с приложениями PhoneGap:
body, body * {
-webkit-user-select: none !important;
user-select: none !important;
-webkit-user-callout: none !important;
-webkit-touch-callout: none !important;
}
input, textarea {
-webkit-user-select: text !important;
user-select: text !important;
-webkit-user-callout: default !important;
-webkit-touch-callout: default !important;
}
Где-то упоминалось, что -webkit-user-callout
это устаревшая версия -webkit-touch-callback
Я положил это на всякий случай.
Для нашего проекта Cordova & Swift я сделал:
override init!(webView theWebView: UIWebView!)
{
super.init(webView: theWebView)
removeLoupe()
}
/**
Removes the magnifying glass by adding a long press gesture that overrides the inherent one that spawns
a the loupe by default.
*/
private func removeLoupe()
{
let views = webView?.subviews
if (views == nil || views?.count == 0)
{
return
}
let longPress = UILongPressGestureRecognizer(target: self, action: "handleLongPress:")
longPress.minimumPressDuration = 0.045
longPress.allowableMovement = 100.0
for view in views!
{
if (view.isKindOfClass(UIScrollView))
{
let subViews = view.subviews
let browser = subViews[0]
browser.addGestureRecognizer(longPress)
break;
}
}
}
/**
Hack to override loupe appearence in webviews.
*/
func handleLongPress(sender:UILongPressGestureRecognizer)
{
}
Обратите внимание, что это мой CDVPlugin
класс (или, скорее, мой пользовательский вариант).
Убедитесь, что ваш файл config.xml имеет:
<feature name="CustomCDVPlugin">
<param name="ios-package" value="CustomCDVPlugin" />
<param name="onload" value="true" />
</feature>
Это обеспечит init()
метод называется.