iphone - functions - ¿Agregar subvista a MKMapView que esté encima del mapa pero debajo de las vistas de anotación?
mkmapview events (3)
Es bastante viejo, 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 una UIView
en UIView
con un fondo negro transparente sobre 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 :)
Edición # 1: Olvidé mencionar que self.viewDark
debería tener inhabilitada la userInteraction
.
Edición n. ° 2: otra cosa que me ayudó fue establecer self.viewDark
''s autoresizesSubviews
en NO
.
Para una aplicación que estoy creando, tengo un PNG con efecto "mapa antiguo" personalizado que me gustaría superponer en la vista MKMapView. Desafortunadamente, de ninguna manera he intentado hacer esto es exactamente correcto:
- Agregue una subvista al MKMapView (problema: el UIImageView para el PNG se coloca encima de los pines de anotación, lo que parece extraño
- 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).
Básicamente, lo que quiero lograr es tener una subvista que esté en capas por encima de los maptiles pero por debajo de las vistas de anotación, y que se mantendrá estable mientras el usuario se desplaza, ¿alguna idea?
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 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 necesitas 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;
}
Tenga en cuenta que todas las MKMapView
MKMapView jerarquías, anotaciones, comportamiento, etc. MKMapViewInternal clase MKMapViewInternal privada MKMapViewInternal , por lo que cambiar cualquier cosa (de una manera que sugiera 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 desea: obtiene una vista entre los mosaicos del mapa y las anotaciones. La tarea restante es cambiar el marco de la vista de superposición personalizada de acuerdo con el desplazamiento / zoom del mapa (lo publicaré si encuentro el camino).