«onTouchEnd» не срабатывает, когда касание завершается за пределами веб-просмотра. Компиляция с XCode 6, iOs 8, iPhone 6

У меня следующий макет:

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

Я могу получать все события касания, когда касание начинается и заканчивается, в веб-представлении. Но если я начну касание в веб-просмотре, а затем переместу касание за его пределы, я перестану получать события touchmove, как только я выйду из границы веб-просмотра, а событие touchend не получено.

Код для тестового 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
Max.L 3 Ноя 2014 в 22:21

2 ответа

Лучший ответ

Я боролся с тем же в течение последних 30 минут, в конце концов я решил реализовать тайм-аут, который восстанавливается с каждым touchmove и начинается touchstart, а сбрасывается touchend. Тайм-аут предназначен, скажем, для 1500ms, и если меня не уволят touchend из веб-просмотра, как должно, я запускаю его по истечении тайм-аута.

Надеюсь, я понял. Это не идеально, но служит частичным исправлением. В моем случае взлом iScroll (_execEvent ('scrollCancel'))

2
maht0rz 2 Апр 2015 в 11:10

У меня была аналогичная проблема, когда я встроил веб-просмотр в собственное приложение. Собственное приложение имеет заголовок размером, скажем, 60 пикселей, а под ним находится веб-просмотр.

Когда вы проводите пальцем вверх из веб-просмотра и отпускаете палец на заголовке, событие «touchend» не распространяется на веб-просмотр.

Я обнаружил, что координата Y в событии touchmove отрицательна, если оставить веб-просмотр наверху, поэтому я использую этот факт, слушая его и программно запуская событие touchend. Работает как босс!

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

}, ложный);

Вот суть того же кода: https://gist.github.com/EddyVerbruggen/70f7b96fcea

2
Eddy Verbruggen 25 Май 2016 в 10:50