Problem z nakładających się adnotacji (MKAnnotationView) na mapie

głosy
9

W mojej aplikacji iPhone, używam MapKit z MKMapView i niestandardowych MKAnnotationView.

Problem jest, gdy adnotacje nakładają się na mapie (w moim app, adnotacje są zdjęcia i te zdjęcia mogą się pokrywać) i po dotknięciu na adnotacją, że pojawi się na przód, to już inna adnotacja (z tyłu), która odbiera zdarzenie (wydaje się być przypadkowe ).

Nie mogę znaleźć żadnego sposobu, aby wysłać zdarzenie do przedniej adnotacji. Nie mogę uwierzyć, że to bug / problem nie ma żadnego rozwiązania!

Z zamawiania i Zakon nakładających się adnotacji pytania na StackOverflow mi nie pomaga, że wiele.

Proszę każdy pomysł jest mile widziany (nawet brudne rozwiązania)!

Oto niektóre z moich kodu (nic nadzwyczajnego, bardzo często):

CustomAnnotation.h

@interface CustomAnnotation : NSObject <MKAnnotation> {
   @private
   CustomAnnotationView* view;
}

    @property (nonatomic, retain) CustomAnnotationView* view;

@end

CustomAnnotation.m

@implementation CustomAnnotation

@synthetize view;

CustomAnnotationView.h

@interface CustomAnnotationView : MKAnnotationView {
}

@end

CustomAnnotationView.m

@implementation CustomAnnotationView

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{
// Do something related to the annotation tapped
}

@end

Główna klasa ... // Adnotacje są dodawane, a niektóre z nich pokrywa się z innymi.

- (void)addAnnotation:(CustomAnnotation*)annotation {
    [map addAnnotation:annotation];
}

...

- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation {

    NSString* identifier = getIdentifierFromAnnotation(annotation);
    CustomAnnotationView* view;
    if(!(view = (CustomAnnotationView*)[map dequeueReusableAnnotationViewWithIdentifier:identifier])) {
        view = [[CustomAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier: identifier];
        [(CustomAnnotation*)annotation setView:view];
        [view release];
    }
    return view;
}
Utwórz 18/03/2010 o 16:07
źródło użytkownik
W innych językach...                            


4 odpowiedzi

głosy
2

Wreszcie, najlepszym sposobem znalazłem i że unika utraty map funcionalities jest:

  • niech dotykowy słuchacza na CustomAnnotationView (touchesEnded) (na każdej adnotacji)

  • podczas odbierania dotykowy zdarzenie, przenieść imprezę do głównej klasie

  • Główna klasa pętle na adnotacje i utrzymuje adnotację, że ma dobrą lokalizację (dotykowy zdarzenie w ramce adnotacji) i że jest z przodu

To działa całkiem dobrze.

Odpowiedział 22/04/2010 o 12:04
źródło użytkownik

głosy
0

Dodałem UITapGestureRecognizer do widoku z przodu i to rozwiązało problem dla mnie.

W twoim przypadku, dodając rozpoznawania gestów do CustomAnnotationView powinno rozwiązać ten problem.

Odpowiedział 15/12/2011 o 15:04
źródło użytkownik

głosy
0

Nawiązując do odpowiedzi Alexandre'a, mam wyłączone wszystkie moje niestandardowe MKAnnotationViews obiektów o

annView.enabled = NO

więc oni nie reagują na domyślnej MKMapView wybierz zachowania i realizowane w moim zwyczaju MKAnnotationView następujące:

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
 self.enabled = YES;
 [(MKMapView*)self.superview selectAnnotation:self.annotation animated:NO];
}

To rozwiązanie działa świetnie na iOS 4. Wydaje się, że wyłączenie MKAnnotationView nie wyłącza jej userInteractionEnabled, natomiast na iOS 3 robi. Nadal szukasz rozwiązania dla iOS 3 ...

EDIT : rzeczywiście, wydaje się to być błąd w iOS 4.1. W iOS 4.2, wyłączając szpilkę również wyłączenie zdarzeń dotykowych. Dlatego metoda ta działa tylko dla 4,1 i ewentualnie 4,0.

Odpowiedział 21/10/2010 o 06:47
źródło użytkownik

głosy
0

Zobacz rozwiązania tej kwestii . Zasadniczo musisz stworzyć przejrzysty UIView który przechwyci wszystkie akcentami. Nie próbowałem, ale może to być więcej kłopotów niż to warte, jeśli masz do reimplement wszystkich funkcji pinch-to-zoom w MKMapView.

Jeśli masz dwie (lub więcej) MKAnnotations kolokacji można wielokrotnie dotknij, aby przełączać się między nimi. To powinno działać bez jakichkolwiek zmian w aplikacji.

Odpowiedział 21/04/2010 o 15:04
źródło użytkownik

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more