4

У меня есть пользовательская клавиатура с WKWebView в полной ширине и высоте. Я отключил прокрутку через wkWebView!.scrollView.scrollEnabled = false, но у меня все еще странное поведение прокрутки при двойном касании в нижней части WKWebView. Вот исходный код простой веб-страницы, которую я пытаюсь загрузить: http://is.gd/gt8h2q (очень простой, просто полный экран div с зеленым фоном и одна строка текста). Ниже, GIF в качестве объяснения. Вот как я создаю WKWebView:Отключить прокрутку с двойным нажатием на WKWebView

class KeyboardViewController: UIInputViewController, WKScriptMessageHandler { 
var wkWebView: WKWebView? 

override func loadView() { 
    super.loadView() 

    let contentController = WKUserContentController() 
    contentController.addScriptMessageHandler(self, name:"callbackTestOne") 

    let config = WKWebViewConfiguration() 
    config.userContentController = contentController 

    self.wkWebView = WKWebView(frame:self.view.frame, configuration:config) 
    self.view = self.wkWebView! 
} 

override func viewDidLoad() { 
    super.viewDidLoad() 

    (...) 

    wkWebView!.scrollView.bounces = false 
    wkWebView!.scrollView.scrollEnabled = false 
    wkWebView!.scrollView.backgroundColor = UIColor(red:248, green:248, blue:248, alpha:1) 
    wkWebView!.scrollView.opaque = true 
    wkWebView!.scrollView.showsHorizontalScrollIndicator = false 
    wkWebView!.scrollView.showsVerticalScrollIndicator = false 
    wkWebView!.scrollView.decelerationRate = UIScrollViewDecelerationRateNormal 
} 

(...) 

GIF explanation

+1

Проблема еще не решена ... Я нашел грязный способ исправить: на моей локальной загруженной странице я использую jQuery для автоматического прокрутки вверх, когда положение прокрутки> 0. Код: '$ (window) .scroll (функция() {if ($ (window) .scrollTop()> 0) {$ (window) .scrollTop (0);};}); ' – Beny

+0

Это настоящая проблема. То же самое происходит при добавлении WKWebView в приложение iMessage или расширение. – quemeful

ответ

-1

Предполагая, что вы находитесь под контролем содержания, что вы отображения в этом WKWebView, вы должны установить правильный видовой экран для него. Это, скорее всего, отключит это поведение.

Как насчет:

<meta id="viewport" name="viewport" 
    content="width=device-width; user-scalable=false" /> 
+1

Да, я пробовал использовать этот видовой экран. Но эта проблема прокрутки: s – Beny

+0

Не работает для меня – akshay1188

4

Hacky и грязного раствора. Но, по крайней мере, это работает. Просто добавьте свой собственный UITapGestureRecognizer в представление, содержащее WKWebView, и сделайте ваш UIViewController делегатом для этого распознавателя жестов. Я использовал этот код:

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer { 
    if ([[otherGestureRecognizer description] containsString:@"WKSyntheticClickTapGestureRecognizer"] && [[otherGestureRecognizer description] containsString:@"numberOfTapsRequired = 2"]) { 
     [otherGestureRecognizer removeTarget:nil action:nil]; 
     return YES; 
    } 

Update 1 После некоторых исследований я обнаружил, что этот подход не так хорошо. У нас проблемы с длинным меню, особенно с отменой выбранного текста. И для меня все еще была проблема - сделайте длинный щелчок, когда меню выглядит слегка проведите пальцем влево или вправо - иногда WKWebView может начать прокрутку. Следующий подход в создании WKSelectionGranularityCharacter для WKWebViewConfiguration - это не очевидно, что я должен сказать (Apple, почему вы это делаете?) Так тогда это прекрасно работает на iOS8 - нет двойное нажатие, каждый жест работает как надо быть. Однако для iOS9 у нас плохие новости - http://www.openradar.me/23345435 Он был сломан. Поэтому продолжайте исследовать.

6

У меня была подобная проблема и вы нашли решение. То есть, чтобы удалить UITapGestureRecognizer, который несет ответственность за неправильное поведение.

WKWebView, или, точнее, UIScrollView и его подзоны, которые содержатся в WKWebView, содержат много распознавателей жестов. Таким образом, вы можете легко перебрать все эти распознаватели в представлениях и удалить тот, который вам нужен.

Если вы хотите удалить все распознаватели двойного касания с одним пальцем из webView, вам необходимо выполнить поиск внутри подзонов прокрутки. Вы могли бы сделать следующее:

// iterate over all subviews of the WKWebView's scrollView 
for subview in _webView.scrollView.subviews { 

    // iterate over recognizers of subview 
    for recognizer in subview.gestureRecognizers ?? [] { 

     // check the recognizer is a UITapGestureRecognizer 
     if recognizer.isKind(of: UITapGestureRecognizer.self) { 

      // cast the UIGestureRecognizer as UITapGestureRecognizer 
      let tapRecognizer = recognizer as! UITapGestureRecognizer 

      // check if it is a 1-finger double-tap 
      if tapRecognizer.numberOfTapsRequired == 2 && tapRecognizer.numberOfTouchesRequired == 1 { 

       // remove the recognizer 
       subview.removeGestureRecognizer(recognizer) 
      } 
     } 
    } 
} 

Это должно устранить вашу проблему.

+0

Приятное объяснение! Работа для моего случая - разрешить только однократное нажатие. Благодаря! –

+0

это прекрасно работает. благодаря – ndreisg