«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 ответа
Я боролся с тем же в течение последних 30 минут, в конце концов я решил реализовать тайм-аут, который восстанавливается с каждым touchmove
и начинается touchstart
, а сбрасывается touchend
. Тайм-аут предназначен, скажем, для 1500ms
, и если меня не уволят touchend
из веб-просмотра, как должно, я запускаю его по истечении тайм-аута.
Надеюсь, я понял. Это не идеально, но служит частичным исправлением. В моем случае взлом iScroll (_execEvent ('scrollCancel'))
У меня была аналогичная проблема, когда я встроил веб-просмотр в собственное приложение. Собственное приложение имеет заголовок размером, скажем, 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
Похожие вопросы
Новые вопросы
ios
iOS - мобильная операционная система, работающая на Apple iPhone, iPod touch и iPad. Используйте этот тег [ios] для вопросов, связанных с программированием на платформе iOS. Используйте связанные теги [target-c] и [swift] для проблем, характерных для этих языков программирования.