2015-10-13 312 views
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

仍然无法解决的问题...我发现了一个肮脏的方法来解决:在我本地加载的页面中,当滚动位置> 0时,我使用jQuery自动滚动到顶部。代码:'$(window).scroll(function (){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

哈克和肮脏的解决方案。但至少它有效。只需将您自己的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; 
    } 

更新1 一些调查,我发现,这种方法也不是那么好后。因为我们在长按菜单方面遇到问题,特别是取消选定的文本。而且对我来说还有一个问题 - 当菜单左右轻扫时长时间点击 - 有时WKWebView可能会开始滚动。 接下来的做法是在设置WKSelectionGranularityCharacterWKWebViewConfiguration - 这不是很明显,我必须说(苹果为什么这样做?)现在,它的工作原理罚款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