2009-11-05 21 views
13

Me estoy frustrando bastante con las limitaciones de MKMapKit. Mi problema actual tiene que ver con el ordenamiento z de las vistas de anotación, particularmente en lo que se refiere a los toques. Si acepta el orden z predeterminado, Mapkit le ofrece:Ordenación Z de MKAnnotationViews

  1. El orden parece aleatorio. El orden z no está relacionado con el orden en que se agregaron las anotaciones.
  2. Si una anotación termina encima de otra, tocar la anotación superior generalmente muestra la llamada para la anotación inferior. Parece que la detección de aciertos ni siquiera respeta el orden de robo. ¿Que pasa con eso?

He intentado resolver # 1 usando algo similar al siguiente código encontrado en la web (que fue diseñado para dar un cierto control sobre el orden z)

 
- (void)mapView:(MKMapView *)mapView didAddAnnotationViews:(NSArray *)views { 
    for (MKAnnotationView * annView in views) { 
     TopBottomAnnotation * ann = (TopBottomAnnotation *) [annView annotation]; 
     if ([ann top]) { 
     [[annView superview] bringSubviewToFront:annView]; 
     } else { 
     [[annView superview] sendSubviewToBack:annView]; 
     } 
    } 

} 

Corriendo a través de las vistas de anotación pasado a mapView: didAddAnnotationViews: y ajustar su orden z parece arreglar # 1. El problema es que ahora las vistas de las llamadas ya no están siempre en la parte superior de las vistas de anotación. El MapKit parece confundirse mucho sobre las capas (las leyendas se deben dibujar en una capa sobre todas las vistas de anotación). Incluso puedo descubrir cómo se confunde, ya que todas las MKAnnotationViews que recibe tienen la misma supervista (una clase privada MKOverlayView). Se podría pensar que cualquier diseño razonable dibujaría las leyendas sobre esta vista de superposición.

¿Alguien ha solucionado con éxito el nº 1 o el nº 2?

+0

¿De dónde sacaste la clase TopBottomAnnotation? –

+0

TopBottomAnnotation es el nombre de su clase de anotación –

+1

... casi 6 años después y estoy teniendo el mismo problema. ¿Cómo no se ha solucionado esto? – Tys

Respuesta

8

Si usted tiene un annotationView personalizado (que suena como que ya tiene) puede intentar añadir esto:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    [self.superview bringSubviewToFront:self]; 
    [super touchesBegan:touches withEvent:event]; 
} 

Un efecto secundario es que cada vez que un marcador se tocó también aparece al frente de el orden z, que en realidad es sensato ya que es en eso que el usuario se está enfocando.

+0

Ramin, Gracias por responder. No creo que eso resuelva mi problema. Son las llamadas que no se muestran en la parte superior de las vistas de anotación. También necesito controlar este orden z de las vistas de anotación sin que el usuario tenga que tocarlas. Algunas de las vistas tienen una "prioridad" más alta y deben mostrarse sobre otras vistas de menor prioridad. – btschumy

+0

No sé si es el mismo problema, pero tenía un montón de marcadores colocados muy juntos.Al tocar cada pin, los rótulos aparecen debajo de los otros pines, por lo que parece que cada vista de anotación mantiene su propia capa de rótulos. Pero tienes razón, los rótulos deberían estar en su propia capa superior. Es posible que desee archivar un informe de error. – Ramin

+0

Ramin, Acabo de probar su solución, y de hecho resuelve el problema de que las leyendas no se muestran en la parte superior de todas las anotaciones. Gracias. Parece haber un problema por el cual las anotaciones se tocan cuando se superponen. Pero eso es menos importante que la otra solución. – btschumy

7

Ramin, eso es perfecto para lo que estoy tratando de hacer. Aunque no tenía definida una vista de anotación personalizada. ¡Lo resolví usando una categoría y funcionó perfecto!

Aquí es el encabezado:

#import <Foundation/Foundation.h> 
#import <MapKit/MapKit.h> 


@interface MKPinAnnotationView (ZIndexFix) 
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event; 
@end 

y la implementación:

#import "AEBMapViewCategory.h" 
@implementation MKPinAnnotationView (ZIndexFix) 
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    [self.superview bringSubviewToFront:self]; 
    [super touchesBegan:touches withEvent:event]; 
} 
@end 
+0

Excelente ... Eso es lo que llamo una buena pieza de código. – Biranchi

+0

¿cómo debe encajar esto junto con mapViewForAnnotations o, más generalmente, el resto de una aplicación mapview? lo siento, no está claro para mí. – si28719e

+0

wow. así que esto parece 'solo funcionar'. que es bastante sorprendente, pero aún me gustaría saber "por qué". y no tengo idea – si28719e

6

Pruebe otra solución, zPosition configuración de vista de anotación de capa (annotationView.layer.zPosition) en:

(void) mapView: (MKMapView *) mapView didAddAnnotationViews: (NSArray *) views;

+0

La forma correcta de hacerlo – rmvz3