MKMapview с UIGestureRecognizers - PullRequest
       19

MKMapview с UIGestureRecognizers

1 голос
/ 26 июля 2011

Итак, у меня есть UIView в качестве моего корневого представления на моем iPad.Я добавляю к нему несколько подпредставлений, среди которых есть и MKMapView.

Я пытаюсь добиться того, чтобы обнаружить пролистывание 3-мя пальцами по экрану, чтобы я мог на него реагировать.Кроме того, мне нужно различать пролистывание 3-мя пальцами влево или вправо.

Прежде чем добавить вид карты, я экспериментировал с touchsMoved и т. Д. Поскольку я обнаружил, что это неточно, я перешел к использованиюUISwipegestureRecognizer, который работал хорошо.

Во всяком случае, когда я добавил карту, она съела все мои прикосновения.Поэтому я продолжал искать ответы.

Этот показался многообещающим:

Перехват / перехват событий iPhone Touch для MKMapView

, а также создание подклассов UIWindow иперехватывая прикосновения.

Ну, оказывается, ни один из них не работает для меня, так как в обоих случаях я в конечном итоге либо в

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event

, либо в ситуации, чтобы распознать прикосновениеи т. д. Это то, что я пытался сделать в первую очередь!

Итак, мой вопрос: есть ли способ использовать UIGestureRecognizer способом, который я описал выше, чтобы поддерживать свои элементы управления при сохранении функциональности MapView??

Достаточно ли точно я описал свою проблему?

Привет.

Ответы [ 3 ]

1 голос
/ 20 октября 2011

Этот ответ описывает создание подкласса распознавателя жестов, чтобы гарантировать, что он не мешает другим распознавателям.

Вы можете добавить пользовательский распознаватель в MKMapView, который перехватывает три пальца (и реагирует соответствующим образом), но затем позволяет всем остальным жестам обрабатываться MKMapView в обычном режиме.

Приведенная выше ссылка дает пример добавления простого нажатия пальцем путем создания подкласса UIGestureRecognizer. Для сканирования тремя пальцами я бы выделил UISwipeGestureRecognizer.

Я успешно использовал этот метод, чтобы добавить вращение двумя пальцами в MKMapView, не путая панорамирование и масштабирование и т. Д.

1 голос
/ 04 февраля 2013

Карта не должна «съедать» все ваши прикосновения. С этим что-то не так - я успешно добавил средства распознавания длинных нажатий и касаний в MKMapView, и они работали, как и ожидалось.

Убедитесь, что ваш контроллер назначен делегатом всех созданных вами распознавателей жестов, и обязательно реализуйте метод:

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer  shouldRecognizeSimultaneouslyWithGestureRecognizer :(UIGestureRecognizer *)otherGestureRecognizer;

Вы можете получить дополнительный контроль, внедрив

 -(BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer;

После этого очень многое зависит от деталей вашей реализации, чтобы заставить распознаватель жестов работать с представлением карты. По моему опыту, вы можете добавить свои собственные, и это не должно мешать вашим распознавателям.

Некоторые другие мысли: - Наложение невидимого взаимодействия с включенным представлением пользователя на MKMapView для получения событий из него. В зависимости от того, какое количество взаимодействий вам нужно в представлении карты, вы можете включать и выключать его и т. Д. - Добавьте другой распознаватель пролистывания в само представление карты (в дополнение к тому, что в родительском представлении).

Вы также можете поиграть с методом UIView hitTest, но для меня это всегда был слишком низкий уровень.

0 голосов
/ 26 июля 2011

Устранит ли удаление распознаватель жестов смахивания из вашего MkMapView?

UISwipeGestureRecognizer *leftSwipeGesture = [[UISwipeGestureRecognizer alloc] init];
UISwipeGestureRecognizer *rightSwipeGesture = [[UISwipeGestureRecognizer alloc] init];

leftSwipeGesture.direction = UISwipeGestureRecognizerDirectionLeft;
rightSwipeGesture.direction = UISwipeGestureRecognizerDirectionRight;

[YourMKMapView removeGestureRecognizer:leftSwipeGesture];
[YourMKMapView removeGestureRecognizer:rightSwipeGesture];

Таким образом, MKMapView не будет отвечать на жесты смахивания и переадресовывает ответчик на контроллер представления контейнера MKMapView.

...