IOS - 没有全屏webview的“touchend”事件

时间:2014-11-03 19:21:39

标签: ios objective-c iphone webview uiwebview

当触摸结束于webview之外时,

“onTouchEnd”未触发。 使用XCode 6,iOs 8,iPhone 6进行编译

我有下一个布局:

|Navigation TAB|
|Left view|Web view|Right view|
|page view|

在网络视图中,我可以在触摸开始和结束时接收所有触摸事件。 但是,如果我开始触摸webview然后在它之外移动触摸,我会在离开webview边界时立即停止接收touchmove事件,并且不会收到任何touchend事件。

代码fot测试html文件:

  <head>
  </head>
  <body bgcolor="#CC6"
      ontouchmove="console.info('move');"
      ontouchstart="console.info('start');"
      ontouchend="console.info('end');"
      ontouchcancelled="console.info('canceled');"
  >
  <h1>This is a test</h1>
  <p> Lore ip sum </p>
  </body>

“viewDidLoad”函数的代码

[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.

self.webView = [[UIWebView alloc] initWithFrame:self.mainView.bounds];

[self.webView setScalesPageToFit:YES];
[self.webView setAlpha:1];

/* Disable scrolling of web view */
for (id subview in [self.webView subviews]) {
    if ([subview isKindOfClass:[UIScrollView class]]) {
        ((UIScrollView*)subview).bounces = NO;
    }
}

self.webView.scrollView.bounces = NO;
self.webView.scrollView.canCancelContentTouches = NO;
self.webView.scrollView.scrollEnabled = NO;

self.webView.backgroundColor = [UIColor magentaColor]; //[UIColor colorWithRed:(45.0/255.0) green:(50.0/255.0) blue:(53.0/255.0) alpha:1];
self.webView.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin| UIViewAutoresizingFlexibleTopMargin | UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleBottomMargin | UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;
[self.mainView addSubview:self.webView];


NSString * localHtmlFilePath = [[NSBundle mainBundle] pathForResource:@"main" ofType:@"html" inDirectory:@"www"];
NSString *html = [NSString stringWithContentsOfFile:localHtmlFilePath encoding:NSUTF8StringEncoding error:nil]; 



[self.webView loadHTMLString:html baseURL:nil];

如何解决这个问题?我错过了一些配置吗?

完整的源代码可以在这里找到:https://github.com/Daraku/WebViewBug

2 个答案:

答案 0 :(得分:2)

过去30分钟我一直在争吵,最后我决定实施一个超时,每个touchmove恢复一次并从touchstart开始,并在{ {1}}。超时是为了让我们说touchend,如果我没有在网页视图中解雇1500ms,我会在超时结束时触发它。

希望我说明一点。它不完美,但作为部分修复。在我的情况下,iScroll(_execEvent('scrollCancel'))

的hackaround

答案 1 :(得分:0)

我有一个类似的问题,我在原生应用中嵌入了一个webview。本机应用程序的标题为60 px,低于它的webview。

从webview向上滑动并在标题上释放手指时,'touchend'事件不会传播到webview。

我发现,当将webview放在顶部时,'touchmove'事件的Y坐标为负,所以我通过听取它并以编程方式触发touchend事件来利用这一事实。像老板一样工作!

document.addEventListener("touchmove", function(e) {
if (e.changedTouches[0].pageY < 0) {
    e.preventDefault();
    document.dispatchEvent(new Event('touchend'));
}

},false);

以下是相同代码的要点:https://gist.github.com/EddyVerbruggen/70b96fce47fa7bf7a34f03e3a2ecb85f