Pregunta

En mi aplicación para el iPhone, estoy usando MapKit con MKMapView y costumbre MKAnnotationView.

El problema es cuando las anotaciones se superponen en el mapa (en mi aplicación, las anotaciones son las fotos y las fotos pueden solaparse) y al tocar en la anotación que aparece en la parte frontal, es otra anotación (en la espalda), que recibe el evento (parece ser al azar).

no he encontrado ninguna manera de enviar el evento a la anotación del delantero. No puedo creer que este error / problema no tiene solución!

Z ordenar y orden de la superposición de anotaciones preguntas sobre stackoverflow no me ayuda mucho.

Por favor, cualquier idea es bienvenida (incluso soluciones sucias)!

Aquí hay algo de mi código (nada especial, muy común):

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

Clase principal     se añaden ... // Anotaciones y algunos de ellos se superpone con otros.

- (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;
}
¿Fue útil?

Solución

Por último, la mejor manera que he encontrado y que evita perder funcionalidades mapa es:

  • dejar que el oyente toque en CustomAnnotationView (touchesEnded) (en cada anotación)

  • cuando se recibe evento táctil, transferir el evento a la clase principal

  • bucles

    clase principal de anotaciones y mantiene la anotación que tiene una buena ubicación (eventos táctiles en el marco de anotación) y que está en frente

Funciona bastante bien.

Otros consejos

Vea la solución a esta cuestión . Básicamente vamos a crear un UIView transparente que interceptará todos los toques. Yo no lo he probado, pero esto puede ser más problemático de lo que vale si tiene que volver a implementar toda la funcionalidad de pellizcar para acercar MKMapView.

Si usted tiene dos (o más) MKAnnotations co-localizados puede tocar varias veces para alternar entre los dos. Eso debería funcionar sin ningún cambio en su aplicación.

El seguimiento de la respuesta de Alexandre, I inhabilitó todos mis MKAnnotationViews personalizados con objetos

annView.enabled = NO

para que no responden al comportamiento de selección por defecto MKMapView, e implementados en mi costumbre MKAnnotationView lo siguiente:

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

Esta solución funciona muy bien en iOS 4. Parece que la desactivación de un MKAnnotationView no desactiva su userInteractionEnabled, mientras que en iOS 3 lo hace. Todavía en busca de una solución para iOS 3 ...

Editar : de hecho, esto parece ser un error en iOS 4.1. En iOS 4.2, la desactivación de un alfiler también desactiva los eventos de toque. Por lo tanto, este método sólo funciona para 4.1 y posiblemente 4.0.

He añadido el UITapGestureRecognizer a la vista al frente y que solucionó el problema para mí.

En su caso, la adición de un reconocedor gesto para CustomAnnotationView debería resolver el problema.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top