Элемент управления Google MapView не поглощает жесты, что приводит к тому, что содержащий прокрутку использует их

У меня есть элемент управления Google MapView для представления, встроенного в элемент управления UISCrollView (SDK Google Maps для iOS с монопривязкой Xamarin.iOS).

Проблема в том, что элемент управления не «проглатывает» жесты смахивания. Таким образом, когда пользователь проводит пальцем по карте, этот процесс также обрабатывается содержащим прокрутку. Это настоящая «остановка шоу», которая делает элемент управления MapView непригодным для меня.

Я попытался получить класс из MapView и переопределить методы GestureRecognizerShouldBegin и TouchesBegan, но они никогда не вызываются.

Похоже, проблема связана с самим элементом управления GMSMapView, а не с привязкой Xamarin: https://code.google.com/p/gmaps-api-issues/issues/detail?id=5311

Как я могу запретить UISCrollView получать/обрабатывать жесты, сделанные в элементе управления MapView?


person Dieter Boullart    schedule 30.04.2013    source источник


Ответы (4)


В текущей (1.3.0) версии Google Maps SDK вы можете получить доступ к следующим настройкам:

self.mapView.settings.scrollGestures = NO;
self.mapView.settings.zoomGestures = NO;
self.mapView.settings.tiltGestures = NO;
person mathisonian    schedule 28.05.2013

вы можете найти, как избежать распространения событий здесь

Надеюсь это поможет

Алекс

person dalexsoto    schedule 30.04.2013

Вы можете обойти это, написав подкласс UIGestureRecognizer, который поглощает касания для любого непрерывного жеста, а затем добавив этот распознаватель в GMSMapView через его свойствоgestRecognizers.

Google не использует распознаватели жестов в своем SDK, поэтому сейчас это не мешает работе карты, хотя в будущих обновлениях это может измениться. Я не знаю, как определить пользовательские распознаватели в MonoTouch, но это кажется возможным (http://docs.xamarin.com/samples/Touch).

Этот распознаватель жестов должен будет реализовать что-то вроде этих методов обработки касаний:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    self.state = UIGestureRecognizerStateBegan;
}

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
    self.state = UIGestureRecognizerStateChanged;
}

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
    self.state = UIGestureRecognizerStateEnded;
}

- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event
{
    self.state = UIGestureRecognizerStateCancelled;
}

Это заставит карту съедать любые прикосновения к ней, как MKMapKit, останавливая любые виды прокрутки выше по иерархии, видя их. Боюсь, я не знаю эквивалентного кода C#/Xamarin.iOS, надеюсь, это будет полезно.

person Heliotron    schedule 13.05.2013

Для справки будущих читателей поста, следующие два улучшения были сделаны в дальнейших выпусках google maps sdk для ios в части решенных проблем:

1, версия 1.3.0 — май 2013 г.: GMSMapView использует касания, что позволяет использовать их внутри таких объектов, как прокрутка.

2, версия 1.3.1 — июнь 2013 г.: GMSMapView более агрессивно потребляет касания.

person tony m    schedule 27.07.2013