Ответ 1
Нет, лупа неразрывно связана с выбором. Чтобы отключить его, вам нужно полностью отключить выделение (вы можете использовать -webkit-user-select: none
).
Как отключить увеличительное стекло, которое появляется, когда вы держите нажатие на UIWebView? Я не хочу отключать взаимодействие с пользователем, но я не хочу, чтобы веб-просмотр показывал это зум-стекло. Любые идеи?
Нет, лупа неразрывно связана с выбором. Чтобы отключить его, вам нужно полностью отключить выделение (вы можете использовать -webkit-user-select: none
).
Поскольку принятое решение не сработало для меня, мне пришлось искать другие варианты, и я нашел его.
Обратите внимание, что я не знаю, одобрит ли Apple эту технику. Используйте его на свой страх и риск.
(Наш не был отклонен, я не думаю, что Apple так сильно заботится о том, чтобы вы возились с внутренними элементами UIWebView
, но должны быть предупреждены.)
То, что я сделал, было рекурсивно спуститься вниз UIWebView
subviews и перечислить их gestureRecognizers
. Когда я сталкиваюсь с UILongPressGestureRecognizer
, я устанавливаю enabled
to NO
.
Это полностью избавляет от увеличительного стекла и, очевидно, отключает любую функцию по умолчанию для длительного нажатия.
Кажется, что iOS повторно активирует (или воссоздает) эти распознаватели жестов всякий раз, когда пользователь начинает редактировать текст.
Ну, я не против использования увеличительного стекла в текстовых полях, поэтому я не отключу их немедленно.
Вместо этого я жду события blur
в своих текстовых элементах, и когда это произойдет, я снова пойду в дереве subview.
Просто как это, и он работает.
Потому что я не знаю, как использовать -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()
.