Отключить усиление в WKWebView

Я ищу способ отключить жест увеличения «щепотку для увеличения» в реализации IOS WKWebView. Существует свойство BOOL для увеличения, доступное для OS X, но похоже, что оно не доступно на iOS.

WKWebView.h

#if !TARGET_OS_IPHONE /* @abstract A Boolean value indicating whether magnify gestures will change the web view's magnification. @discussion It is possible to set the magnification property even if allowsMagnification is set to NO. The default value is NO. */ @property (nonatomic) BOOL allowsMagnification; 

Я также попытался взглянуть на распознающие жесты WKWebView, но похоже, что он запускает пустой массив. Я предполагаю, что фактические распознаватели более глубже в структуре компонента (довольно сложные, по внешнему виду), и, скорее всего, не захотят их копать, если это вообще возможно.

Я знаю о возможных хаках, которые могут потенциально отключить жест от стрельбы (выборочно передавая жесты в WebView, добавляя дочерний вид, чтобы захватить жест щепотки и т. Д.), Но я всегда обнаружил, что они вносят вклад в событие и хотят сохранить реализацию как очистить / взломать бесплатно, насколько это возможно.

Вы можете запретить пользователям изменять масштаб, установив делегат вашего UKcrollView WKWebKit и реализуя следующий метод:

 func viewForZooming(in scrollView: UIScrollView) -> UIView? { return nil } 

Следующий ответ больше не работает в бета-версии iOS 10.

Чтобы улучшить доступность веб-сайтов в Safari, пользователи теперь могут сжимать до масштабирования, даже если веб-сайт устанавливает масштабируемое пользователем значение = нет в окне просмотра.


WKWebView, похоже, уважает метатег viewport так же, как делает Mobile Safari (как и следовало ожидать). Итак, я обнаружил, что этот тег в DOM через javascript после загрузки страницы делает трюк. Я бы устал от этого решения, если вы точно не знаете, какой HTML загружается в webview, иначе я подозреваю, что у него были бы непреднамеренные последствия. В моем случае я загружаю HTML-строки, поэтому я могу просто добавить их в HTML-код, который я отправляю с приложением.

Чтобы сделать это в общем для любой веб-страницы:

 - (void)webView:(WKWebView *)webView didCommitNavigation:(WKNavigation *)navigation { NSString *javascript = @"var meta = document.createElement('meta');meta.setAttribute('name', 'viewport');meta.setAttribute('content', 'width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no');document.getElementsByTagName('head')[0].appendChild(meta);"; [webView evaluateJavaScript:javascript completionHandler:nil]; } 

Возможно, было бы разумно взглянуть на то, какая навигация только что была завершена, так как только новая страница будет нуждаться в этом javascript.

Полная версия Swift 3 / iOS 10 ответа Ландшафта:

 import UIKit import WebKit class MyViewController: UIViewController, UIScrollViewDelegate { var webView = WKWebView() override func viewDidLoad() { super.viewDidLoad() self.view.addSubview(webView) webView.scrollView.delegate = self } // Disable zooming in webView func viewForZooming(in: UIScrollView) -> UIView? { return nil; } } 

Swift 2.0

 extension WKWebView { func viewForZoomingInScrollView(scrollView: UIScrollView) -> UIView? { return nil } } 

Я попытался установить minimumZoomScale и maximumZoomScale свойства UIScrollView на 1 или isMultipleTouchEnabled свойство UIView на false или вернуть viewForZooming(in:) из вызова viewForZooming(in:) UIScrollViewDelegate но никто не работал. В моем случае после нескольких проб и ошибок в моем случае работает следующее [Протестировано на iOS 10.3]:

 class MyViewController: UIViewController { var webView: WKWebView? override viewDidLoad() { super.viewDidLoad() //... self.webView.scrollView.delegate = self //... } } extension MyViewController: UIScrollViewDelegate { func scrollViewWillBeginZooming(_ scrollView: UIScrollView, with view: UIView?) { scrollView.pinchGestureRecognizer?.isEnabled = false } } 

У меня недостаточно репутации, чтобы добавлять комментарии к ответам, но я хотел упомянуть, что решение Кевина (meta viewport) больше не работает в бета-версии iOS 10. Решение Landschaft работает для меня, хотя!

Поскольку решение JS использует стандарты W3C, оно всегда должно поддерживаться.

Ах, Кевин, я бы хотел, чтобы это было так.

Подробнее здесь: https://stackoverflow.com/a/37859168/1389714

Если вам не важно обрабатывать ссылки внутри html (скажем, вы хотите отображать только текст), самым простым было бы отключить взаимодействие пользователя webView.userInteractionEnabled = false

Нам нужно изменить вызов делегата со следующими сигнатурами в XCode 8:

override func viewForZooming (в scrollView: UIScrollView) -> UIView? {return nil}

это то, как я отключил масштабирование для контроллера просмотра Swift3 для приложения с одним веб-браузером

 import UIKit import WebKit class ViewController: UIViewController, WKNavigationDelegate, UIScrollViewDelegate { @IBOutlet var webView: WKWebView! override func loadView() { webView = WKWebView() webView.navigationDelegate = self view = webView } override func viewDidLoad() { super.viewDidLoad() webView.scrollView.delegate = self } func viewForZooming(in: UIScrollView) -> UIView? { return nil; } } 

Приложение, над которым я работаю, требует, чтобы представление было увеличено с помощью Javascript. Принятый ответ заблокировал масштабирование JavaScript изнутри страницы. Мне нужно было отключить жест щепотки пользователем приложения. Единственное решение, которое я нашел, – отключить жест веб-представления после загрузки страницы:

 - (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation { /* disable pinch gesture recognizer to allow zooming the web view by code but prevent zooming it by the user */ for (UIGestureRecognizer *gr in self.webView.scrollView.gestureRecognizers) { if ([gr isKindOfClass:[UIPinchGestureRecognizer class]]) { gr.enabled = NO; } } } 
  • Ошибка: wk не может получить утверждение для процесса 0
  • Как проверить, заканчивается ли загрузка WkWebView в Objective-C?
  • Выбор текста в WKWebView: WKSelectionGranularityCharacter
  • WKWebView не обрабатывает заголовок «Set-Cookie» правильно
  • при перенаправлении с кодом 302 WKWebView не может установить cookie
  • Как правильно реализовать didFailProvisionalNavigation с помощью WKWebView?
  • Как устранить нарушения в Google Login / Registration на WKWebView?
  • Аутентификация с помощью WKWebView в Swift
  • Скрытие панели аксессуаров клавиатуры в WKWebView
  • Снимок экрана WKWebView не полностью обеспечивает полную высоту страницы
  • как я могу очистить содержимое UIWebView / WKWebView?
  • Давайте будем гением компьютера.