¿Agregar una subvista a MKMapView que esté por encima del mapa pero por debajo de las vistas de anotación?

StackOverflow https://stackoverflow.com/questions/1622633

Pregunta

Para una aplicación que estoy creando, tengo un " mapa antiguo " personalizado; efecto PNG que me gustaría superponer en la vista MKMapView. Desafortunadamente, de ninguna manera he intentado hacer esto es exactamente correcto:

  1. Agregue una subvista al MKMapView (problema: el UIImageView para el PNG se coloca arriba los pines de Anotación, que se ven raros
  2. Convierta la imagen en una vista de anotación y colóquela debajo de las demás (problema: en el desplazamiento, tengo que mover la imagen de la vista de anotación, y durante un tiempo solo aparece el mapa normal en lugar del efecto antiguo) .

Lo que básicamente quiero lograr es tener una subvista en capas por encima de los maptiles pero por debajo de las vistas de anotación, y se mantendrá estable mientras el usuario se desplaza por la página & # 8212; ¿alguna idea?

¿Fue útil?

Solución

Tenga en cuenta que todas las subvistas MKMapView forman parte de la jerarquía, las anotaciones, el comportamiento, etc. La clase MKMapViewInternal , por lo que cambiar cualquier cosa (de una manera que sugiero u otra) en esta estructura puede hacer que su aplicación 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 vista de supervisión que las vistas de anotación y garantizar que las anotaciones se colocarán sobre nuestra superposición. En MKMapViewDelegate implementamos:

- (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 la mitad de lo que quieres: obtienes una vista entre los mosaicos del mapa y las anotaciones. La tarea restante es cambiar el marco de vista de superposición personalizado según el desplazamiento / zoom del mapa (lo publicaré si encuentro el camino).

Otros consejos

Hice algo similar y de una manera diferente al final. Quería desvanecer la vista del mapa 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 gustó que intentara agregar una superposición para todo el globo).

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 debes agregar el delegado del mapa para dibujarlos:

- (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;
}

Es bastante antiguo, pero quizás aún sea relevante para algunos de ustedes.

Quería oscurecer el mapa, pero no las vistas de anotación.

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

Puse un UIView con un fondo negro transparente sobre el MKMapView , y luego agregué 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];
    }
}

Espero que ayude ... y, por supuesto, si encuentra algún problema con esta solución, hágamelo saber :)

Editar # 1: Olvidé mencionar que self.viewDark debería tener userInteraction desactivado.

Editar # 2: Otra cosa que me ayudó fue establecer self.viewDark en autorizesSubviews en NO .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top