Problemet med overlappende merknader (MKAnnotationView) på kartet

stemmer
9

I min iphone applikasjon, jeg bruker MapKit med MKMapView og tilpasset MKAnnotationView.

Problemet er når merknader lapper på kartet (i min app, merknader er bilder og disse bildene kan overlappe) og når du trykker på merknaden som vises på forsiden, er det en annen merknad (på baksiden) som mottar hendelsen (synes å være tilfeldig ).

Jeg fant ikke noen måte å sende hendelsen til fronten merknader. Jeg kan ikke tro at denne feilen / problemet ikke har noen løsning!

Z bestilling og Order of overlappende merknader spørsmål om Stackoverflow hjalp ikke meg så mye.

Vennligst noen ide er velkommen (selv skitne løsninger)!

Her er noen av koden min (ikke noe fancy, svært vanlig):

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

Hoved klasse ... // Kommentarer er lagt til og noen av dem overlapper med andre.

- (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;
}
Publisert på 18/03/2010 klokken 15:07
kilden bruker
På andre språk...                            


4 svar

stemmer
2

Til slutt, den beste måten jeg fant og som unngår å miste kart funcionalities er å:

  • la berørings lytteren på CustomAnnotationView (touchesEnded) (på hver merknad)

  • ved mottak av berøringsaktivitet, overføre arrangementet til hoved klasse

  • Hoved klasse løkker på merknader og holder annotering som har en god plassering (touch-arrangement i kommentar rammen), og som er i front

Det fungerer ganske bra.

Svarte 22/04/2010 kl. 11:04
kilden bruker

stemmer
0

Jeg har lagt til UITapGestureRecognizer til visningen foran og som løste problemet for meg.

I ditt tilfelle, bør legge en gest gjenkjenner å CustomAnnotationView løse problemet.

Svarte 15/12/2011 kl. 14:04
kilden bruker

stemmer
0

Oppfølging på Alex svar, jeg deaktivert alle mine tilpassede MKAnnotationViews objekter med

annView.enabled = NO

slik at de ikke reagerer på MKMapView standard velger atferd, og gjennomføres i min egendefinert MKAnnotationView følgende:

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

Denne løsningen fungerer bra på iOS 4. Det virker som deaktiverer en MKAnnotationView ikke deaktiverer sin userInteractionEnabled, mens på iOS 3 det gjør. Fortsatt på jakt etter en løsning for iOS 3 ...

EDIT : egentlig, synes dette å være en bug i iOS 4.1. I iOS 4.2, deaktivering av en tapp deaktiverer også berøring. Derfor er denne metode fungerer bare for 4,1 og muligens 4,0.

Svarte 21/10/2010 kl. 05:47
kilden bruker

stemmer
0

Se løsningen på dette spørsmålet . I utgangspunktet vil du lage en gjennomsiktig UIView som vil fange opp alle de tingene. Jeg har ikke prøvd det, men dette kan være mer trøbbel enn det er verdt hvis du må reimplement alle pinch-to-zoom-funksjonalitet i MKMapView.

Hvis du har to (eller flere) MKAnnotations samlokalisert kan du gjentatte ganger trykke på for å veksle mellom de to. Som skal fungere uten endringer i programmet.

Svarte 21/04/2010 kl. 14:04
kilden bruker

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