Problema con le annotazioni sovrapposte (MKAnnotationView) sulla mappa

voti
9

Nella mia applicazione iphone, sto usando MapKit con MKMapView e personalizzati MKAnnotationView.

Il problema è quando le annotazioni si sovrappongono sulla mappa (nella mia app, le annotazioni sono foto e quelle foto possono sovrapporsi) e quando si tocca l'annotazione che appare sulla parte anteriore, è un altro di annotazione (sul retro), che riceve l'evento (sembra essere casuale ).

Non ho trovato alcun modo per inviare l'evento per l'annotazione anteriore. Non posso credere che questo bug / problema non ha una soluzione!

Z ordinamento e Ordine di sovrapposizione annotazioni domande su StackOverflow non mi ha aiutato più di tanto.

Si prega di qualsiasi idea è benvenuto (anche soluzioni sporche)!

Ecco alcuni dei miei codice (niente di speciale, molto comune):

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

Classe principale ... // annotazioni vengono aggiunti e alcuni di loro si sovrappone con gli altri.

- (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;
}
È pubblicato 18/03/2010 alle 16:07
fonte dall'utente
In altre lingue...                            


4 risposte

voti
2

Infine, il modo migliore che ho trovato e che evita di perdere mappa funzionalita è quello di:

  • lasciare l'ascoltatore tocco sul CustomAnnotationView (touchesEnded) (su ogni annotazione)

  • quando si riceve evento di tocco, trasferire l'evento di classe principale

  • classe principale loop sulle annotazioni e mantiene l'annotazione che ha una buona posizione (evento di tocco nella cornice annotazione) e che si trova di fronte

Funziona abbastanza bene.

Risposto il 22/04/2010 a 12:04
fonte dall'utente

voti
0

Ho aggiunto l'UITapGestureRecognizer alla vista di fronte e che risolto il problema per me.

Nel tuo caso, l'aggiunta di un sistema di riconoscimento gesto per CustomAnnotationView dovrebbe risolvere il problema.

Risposto il 15/12/2011 a 15:04
fonte dall'utente

voti
0

Facendo seguito alla risposta di Alexandre, ho disabilitato tutti i miei MKAnnotationViews oggetti personalizzati con

annView.enabled = NO

in modo che non rispondono al comportamento di selezione MKMapView di default, e attuate nel mio costume MKAnnotationView il seguente:

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

Questa soluzione funziona alla grande su iOS 4. Sembra che la disattivazione di un MKAnnotationView non disabilita la sua userInteractionEnabled, mentre su iOS 3 lo fa. Ancora alla ricerca di una soluzione per iOS 3 ...

EDIT : In realtà, questo sembra essere un bug in iOS 4.1. In IOS 4.2, disabilitando un perno disattiva anche gli eventi di tocco. Quindi questo metodo funziona solo per 4.1 e possibilmente 4.0.

Risposto il 21/10/2010 a 06:47
fonte dall'utente

voti
0

Vedere la soluzione a questa domanda . In pratica si creerà un'UIView trasparente che intercettare tutti i tocchi. Non ho provato, ma questo può essere più problemi di quanti ne vale la pena se si deve reimplementare tutte le funzionalità pinch-to-zoom in MKMapView.

Se si dispone di due (o più) MKAnnotations co-location si può toccare ripetutamente per passare tra i due. Che dovrebbe funzionare senza alcuna modifica alla tua app.

Risposto il 21/04/2010 a 15:04
fonte dall'utente

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