2010-09-14 14 views
7

Necesito un código que se puede usar fuera de las funciones mk *. Necesito ejecutar mi función personalizada para traer los PRIMEROS y ÚLTIMOS marcadores en una matriz al frente. (así que encima de todos los otros marcadores en mi pantalla). He tratadoiphone mapview traer la primera y la última anotación al frente

[self.view bringSubviewToFront:[[mapView annotations]objectAtIndex: 0]]; 

he utilizado [[mapView annotations]objectAtIndex: 0] en mi código y que funciona, pero se cae cuando trato de llevar esto a la parte delantera. ¿Estoy accediendo a la capa incorrecta o algo así?

gracias por cualquier ayuda.

Respuesta

10

Usted está trayendo las cosas incorrectas al frente. A saber, la matriz annotations es una matriz de objetos que se ajustan al protocolo MKAnnotation (por lo tanto, del tipo id<MKAnnotation>) y no son vistas.

cambio, que debería estar recibiendo la vista de las anotaciones que desea, y llevar a los de la parte delantera:

id<MKAnnotation> annotation = [[mapView annotations] objectAtIndex:0]; 
MKAnnotationView* annotationView = [mapView viewForAnnotation:annotation]; 
if (annotationView != nil) { 
    [annotationView.superview bringSubviewToFront:annotationView]; 
} 

Sin embargo, se debe tener en cuenta un par de cosas:

  1. annotationView puede ser nil si la anotación está en un punto que está fuera de la pantalla, o si las anotaciones no han terminado de agregarse al mapa. Sin embargo, si es nil, probablemente no le importe si una anotación que ni siquiera está en la pantalla está al frente o no.
  2. es necesario llamar a bringSubviewToFront en supervista la annotationView 's, y no en self.view o incluso mapView, ya que ninguno de esos son los supervista del annotationView.
+0

tiene sentido, ¡gracias! No necesito preocuparme porque la anotación sea nula, ya que el zoom anterior al código de región garantiza que cuando llame a este código estarán en la pantalla (al menos por una fracción, a medida que se dibujen). Daré un giro al código mañana. Muchas gracias por la respuesta. –

+0

Llamada importante bringSubviewToFront en anotaciónView.superview en lugar de annotationView – Zee

+0

Es posible que también desee agregar esto si (! [L es KindOfClass: [MKUserLocation class]]) { –

1

Esto funcionó mucho mejor para mí:

configuración de vista de anotación de capa zPosition (annotationView.layer.zPosition) en:

- (MKAnnotationView *)mapView:(MKMapView *)theMapView viewForAnnotation:(id <MKAnnotation>)annotation 
{ 
    // if it's the user location, just return nil. 
    if ([annotation isKindOfClass:[MKUserLocation class]]) 
     return nil; 

    MKAnnotationView *returnedAnnotationView = nil; 
    returnedAnnotationView = [CUSTOMVIEW createViewAnnotationForMapView:self.mapView annotation:annotation]; 
    // SOME CUSTOM PROCESSING... 
    returnedAnnotationView.layer.zPosition = 3; 
    return returnedAnnotationView; 
} 

Tenga en cuenta que supongo que la zPosition por defecto es 0. Si se establece a 3 hizo que los 3 marcadores aparecieran arriba para mí.

Cuestiones relacionadas