2009-10-26 20 views
17

Para una aplicación que estoy construyendo, tengo un PNG con efecto "mapa antiguo" personalizado que me gustaría superponer en la vista MKMapView. Por desgracia, ninguno como yo he tratado de hacer esto es exactamente correcto:¿Agregar subvista a MKMapView que está sobre el mapa pero debajo de las vistas de anotación?

  1. Añadir una vista secundaria a la MKMapView (tema: la UIImageView para el PNG se coloca por encima de los pasadores de anotación, que se ve raro
  2. Haga que la imagen sea una vista de anotación y colóquela debajo de las demás (problema: en desplazamiento, debo mover la imagen de la vista de anotación, y por un momento solo aparece el mapa normal en lugar del efecto antiguo).

Lo que básicamente quiero lograr es tener una subvista que se superpone sobre los maptiles pero debajo de las vistas de anotación, y eso se mantendrá estable mientras el usuario se desplaza, ¿alguna idea?

+3

Wow, cuestión de edad sin ningún tipo de respuesta. +1 de mí ya que también necesito esto – bentford

+0

¿Alguien ha descubierto esto todavía? – horseshoe7

Respuesta

4

en cuenta que todas MKMapView subvistas jerarquía, anotaciones, etc comportamiento procede de la clase interna privada MKMapViewInternal por lo que cambiar nada (de una manera u otra Sugiero) en esta estructura puede causar que su solicitud sea rechazada desde Appstore.

No tengo una solución completa, solo una idea. Mi idea es hacer que una vista de superposición tenga la misma supervista que las vistas de anotación y asegurar que las anotaciones se colocarán sobre nuestra superposición. En MKMapViewDelegate ponemos en práctica:

- (void)mapView:(MKMapView *)aMapView didAddAnnotationViews:(NSArray *)views{ 
    if (views.count > 0){ 
     UIView* tView = [views objectAtIndex:0]; 

     UIView* parView = [tView superview]; 
     UIView* overlay = [tView viewWithTag:2000]; 
     if (overlay == nil){ 
      overlay = [[UIImageView alloc] initWithImage:[UIImage imageNamed:MY_IMAGE_NAME]]; 
      overlay.frame = parView.frame; //frame equals to (0,0,16384,16384) 
      overlay.tag = 2000; 
      overlay.alpha = 0.7; 
      [parView addSubview:overlay]; 
      [overlay release]; 
     } 

     for (UIView* view in views) 
      [parView bringSubviewToFront:view]; 
    } 
} 

Este código hace una media de lo que quiere - se obtiene una vista colocado entre los mosaicos de mapas y anotaciones. La tarea restante es cambiar el marco de vista de superposición personalizado de acuerdo con el desplazamiento/zoom del mapa (lo publicaré si encuentro el camino).

+0

Buena respuesta, esto funcionó también para una superposición en la que queríamos un degradado en el mapa, pero quería que los pines se destacaran. –

0

Es bastante viejo, pero tal vez todavía sea relevante para algunos de ustedes.

Quería hacer el mapa más oscuro, pero no las vistas de anotación.

lo que hice fue muy simple y que todavía no sé si tiene algunos retrocesos ...

pongo un UIView con un fondo negro transparente por encima de la MKMapView, y después se añade el siguiente código:

- (void)mapView:(MKMapView *)mapView didAddAnnotationViews:(NSArray<MKAnnotationView *> *)views 
{ 
    for (MKAnnotationView *view in views) { 
     view.center = [self.mapView convertCoordinate:view.annotation.coordinate toPointToView:self.viewDark]; 
     [self.viewDark addSubview:view]; 
    } 
} 

creo que sirve .. y por supuesto - si usted encuentra cualquier problema acerca de esta solución por favor hágamelo saber :)

Edición # 1: Olvidé mencionar que self.viewDark debe tener userInteraction deshabilitado.

Edición # 2: Otra cosa que me ayudó es el ajuste self.viewDark 's autoresizesSubviews-NO.

1

Hice algo similar y de una manera diferente al final. Quería atenuar el mapa vista agregando una superposición blanca, pero no quería desvanecer las anotaciones. Agregué una superposición al mapa (en realidad tuve que agregar dos porque no me gustaba intentar agregar una superposición para todo el mundo).

CLLocationCoordinate2D pt1, pt2, pt3, pt4; 
pt1 = CLLocationCoordinate2DMake(85, 0); 
pt2 = CLLocationCoordinate2DMake(85, 180); 
pt3 = CLLocationCoordinate2DMake(-85, 180); 
pt4 = CLLocationCoordinate2DMake(-85, 0); 
CLLocationCoordinate2D coords[] = {pt1, pt2, pt3, pt4}; 
MKPolygon *p = [MKPolygon polygonWithCoordinates:coords count:4]; 
[self.mapView addOverlay:p]; 

pt1 = CLLocationCoordinate2DMake(85, 0); 
pt2 = CLLocationCoordinate2DMake(85, -180); 
pt3 = CLLocationCoordinate2DMake(-85, -180); 
pt4 = CLLocationCoordinate2DMake(-85, 0); 
CLLocationCoordinate2D coords2[] = {pt1, pt2, pt3, pt4}; 
MKPolygon *p2 = [MKPolygon polygonWithCoordinates:coords2 count:4]; 
[self.mapView addOverlay:p2]; 

Luego hay que añadir el mapa delegado para atraerlos:

- (MKOverlayRenderer *)mapView:(MKMapView *)mapView rendererForOverlay:(id<MKOverlay>)overlay { 
    if ([overlay isKindOfClass:MKPolygon.class]) { 
     MKPolygonRenderer *polygonView = [[MKPolygonRenderer alloc] initWithOverlay:overlay]; 
     polygonView.fillColor = [UIColor colorWithRed:255.0/255.0 green:255.0/255.0 blue:255.0/255.0 alpha:0.4]; 
     return polygonView; 
    } 
    return nil; 
} 
Cuestiones relacionadas