Problème avec annotations se chevauchent (MKAnnotationView) sur la carte

voix
9

Dans mon application iphone, j'utilise MapKit avec MKMapView et personnalisée MKAnnotationView.

Le problème est quand les annotations se chevauchent sur la carte (dans mon application, les annotations sont des photos et ces photos peuvent se chevaucher) et lorsque vous appuyez sur l'annotation qui apparaît à l'avant, il est une autre annotation (au dos) qui reçoit l'événement (semble être aléatoire ).

Je ne trouve pas un moyen d'envoyer l'événement à l'annotation avant. Je ne peux pas croire que ce bug / problème n'a pas de solution!

Commande Z et ordre des annotations qui se chevauchent des questions sur StackOverflow ne m'a pas aidé beaucoup.

S'il vous plaît toute idée est la bienvenue (même des solutions sales)!

Voilà une partie de mon code (rien d'extraordinaire, très fréquent):

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 ... // Les annotations sont ajoutées et certains d'entre eux chevauche avec les autres.

- (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;
}
Créé 18/03/2010 à 16:07
source utilisateur
Dans d'autres langues...                            


4 réponses

voix
2

Enfin, la meilleure façon que je trouve et qui évite de perdre carte funcionalities est à:

  • laissez l'auditeur contact sur CustomAnnotationView (touchesEnded) (sur chaque annotation)

  • lors de la réception événement tactile, transférer l'événement à la classe principale

  • boucles principales classes sur les annotations et conserve l'annotation qui a un bon emplacement (événement tactile dans le cadre d'annotation) et qui est en face

Il fonctionne très bien.

Créé 22/04/2010 à 12:04
source utilisateur

voix
0

J'ai ajouté le UITapGestureRecognizer à la vue à l'avant et qui a résolu le problème pour moi.

Dans votre cas, l'ajout d'un geste de reconnaissance à CustomAnnotationView devrait résoudre le problème.

Créé 15/12/2011 à 15:04
source utilisateur

voix
0

Faisant suite à la réponse d'Alexandre, j'ai désactivé tous mes MKAnnotationViews personnalisés avec des objets

annView.enabled = NO

ils ne répondent pas au comportement de sélection par défaut MKMapView, et mis en œuvre dans mon habitude MKAnnotationView les éléments suivants:

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

Cette solution fonctionne très bien sur iOS 4. Il semble que la désactivation d'un MKAnnotationView ne désactive pas son userInteractionEnabled, alors que sur iOS 3, il fait. Toujours à la recherche d'une solution pour iOS 3 ...

EDIT : En fait, cela semble être un bogue dans iOS 4.1. Dans iOS 4.2, la désactivation d' une broche désactive également les événements tactiles. Par conséquent , cette méthode ne fonctionne que pour 4.1 et peut - être 4,0.

Créé 21/10/2010 à 06:47
source utilisateur

voix
0

Voir la solution à cette question . Fondamentalement , vous allez créer un UIView transparent qui interceptera toutes les touches. Je ne l' ai pas essayé, mais cela peut être plus d' ennuis que cela vaut la peine si vous devez réimplémenter toutes les fonctionnalités de pincement à zoom MKMapView.

Si vous avez deux (ou plus) MKAnnotations co-localisés, vous pouvez à plusieurs reprises appuyez sur pour activer les deux. Cela devrait fonctionner sans aucune modification à votre application.

Créé 21/04/2010 à 15:04
source utilisateur

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