Edición con anotaciones de solapamiento (MKAnnotationView) en el mapa

votos
9

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!

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

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

He aquí algunos 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 solapa 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;
}
Publicado el 18/03/2010 a las 16:07
fuente por usuario
En otros idiomas...                            


4 respuestas

votos
2

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)

  • al recibir eventos táctiles, transferir el caso a la clase principal

  • clase principal bucles 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.

Respondida el 22/04/2010 a las 12:04
fuente por usuario

votos
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.

Respondida el 15/12/2011 a las 15:04
fuente por usuario

votos
0

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

annView.enabled = NO

por lo 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.

Respondida el 21/10/2010 a las 06:47
fuente por usuario

votos
0

Ver 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 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.

Respondida el 21/04/2010 a las 15:04
fuente por usuario

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