Ordenamiento Z de MKAnnotationViews

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

  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, al tocar la anotación superior generalmente aparece 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?

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

- (void) mapView: (MKMapView *) mapView didAddAnnotationViews: (NSArray *) views {
   para (MKAnnotationView * annView en vistas) {
      TopBottomAnnotation * ann = (TopBottomAnnotation *) [annView annotation];
      if ([arriba]] {
         [[supervista de annView] bringSubviewToFront: annView];
      } else {
         [[supervista de annView] sendSubviewToBack: annView];
      }
   }

}

Ejecutando a través de las vistas de anotación pasadas a mapView: didAddAnnotationViews: y ajustando 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 resuelto el # 1 o el # 2 exitosamente?

Publicado el 05/11/2009 a las 17:04
fuente por usuario
En otros idiomas...                            


3 respuestas

votos
8

Si tiene un anotaciónView personalizado (que parece que ya tiene), puede intentar agregar esto:

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

Un efecto colateral es que cada vez que se toca un marcador, también aparece al principio del orden z, lo cual es realmente sensato, ya que es en eso que el usuario se está enfocando.

Respondida el 05/11/2009 a las 17:54
fuente por usuario

votos
7

Ramin, que es perfecto para lo que yo estoy tratando de hacer. No tenía una vista de anotación personalizada definida sin embargo. He resuelto mediante el uso de 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 aplicación:

#import "AEBMapViewCategory.h"
@implementation MKPinAnnotationView (ZIndexFix)
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{
    [self.superview bringSubviewToFront:self];
    [super touchesBegan:touches withEvent:event];
}
@end
Respondida el 04/12/2009 a las 19:40
fuente por usuario

votos
6

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

(Void) MAPview: (MKMapView *) didAddAnnotationViews MAPview: (*) NSArray puntos de vista;

Respondida el 03/05/2013 a las 12:12
fuente por usuario

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