Сенсорные события на оверлеях MKMapView - PullRequest
9 голосов
/ 22 июня 2011

В приложении, которое я сейчас разрабатываю, у меня есть MKMapView с наложениями (настроено MKPolylines кстати), и я хотел бы иметь возможность обнаруживать сенсорные события на этих наложениях и назначать определенное действие каждому наложению , Может ли кто-нибудь помочь мне в этом? Спасибо!

Benja

Ответы [ 2 ]

18 голосов
/ 16 ноября 2011

Эту проблему можно решить, комбинируя Как перехватить события касаний в объектах MKMapView или UIWebView? и Как определить, находится ли аннотация внутри MKPolygonView (iOS) .Добавьте это в viewWillAppear:

WildcardGestureRecognizer * tapInterceptor = [[WildcardGestureRecognizer alloc] init];
tapInterceptor.touchesBeganCallback = ^(NSSet * touches, UIEvent * event) {
    UITouch *touch = [touches anyObject];
    CGPoint point = [touch locationInView:self.mapView];

    CLLocationCoordinate2D coord = [self.mapView convertPoint:point toCoordinateFromView:self.mapView];
    MKMapPoint mapPoint = MKMapPointForCoordinate(coord);
    for (id overlay in self.mapView.overlays) 
    {
        if ([overlay isKindOfClass:[MKPolygon class]])
        {
            MKPolygon *poly = (MKPolygon*) overlay;
            id view = [self.mapView viewForOverlay:poly];
            if ([view isKindOfClass:[MKPolygonView class]])
            {
                MKPolygonView *polyView = (MKPolygonView*) view;
                CGPoint polygonViewPoint = [polyView pointForMapPoint:mapPoint];
                BOOL mapCoordinateIsInPolygon = CGPathContainsPoint(polyView.path, NULL, polygonViewPoint, NO);   
                if (mapCoordinateIsInPolygon) {
                    debug(@"hit!") 
                } else {
                    debug(@"miss!");   
                }
            }
        }
    }

};
[self.mapView addGestureRecognizer:tapInterceptor];

WildcardGestureRecognizer в первом связанном ответе.Вызов mapView:viewForOverlay: не будет дешевым, добавление локального кэша поможет.

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

На всякий случай это может помочь некоторым из вас ... Я не мог найти способ сделать это, но я добавил аннотацию на свои оверлеи (во всяком случае, мне нужно было сделать это, чтобы отобразить некоторую информацию), а затем я могполучить сенсорное событие в этой аннотации.Я знаю, что это не лучший способ сделать это, но в моей ситуации, и, возможно, у вас, это работает;)!

...