2009-10-26 59 views
17

对于我正在构建的应用程序,我有一个自定义的“旧地图”效果PNG,我想在MKMapView视图上叠加。不幸的是,这样我试图做到这一点是完全正确的:将子视图添加到位于地图上方但位于注释视图下方的MKMapView中?

  1. 添加一个子视图到的MKMapView(问题:UIImageView的为PNG被放置以上注释销,这看起来奇怪
  2. 使图像成为注释视图本身并将其放置在其他图像下方(问题:在滚动中,我必须移动注释视图图像,并且有一段时间只是常规图而不是旧时效)

我基本上想要完成的是有一个子视图分层以上的地图但低于注释视图,并且在用户滚动时会保持稳定 - 任何想法?

所有 MKMapView子视图层次结构,注释,在内部私有 MKMapViewInternal类的行为等进行得如此改变任何东西(的方式我建议或其他)在这个结构可能导致应用程序
+3

哇,绝对没有回答古老的问题。从我+1,因为我也需要这 – bentford 2010-01-09 11:20:18

+0

有人想通了吗? – horseshoe7 2011-07-20 16:07:58

回答

4

注意从苹果商店被拒绝。

我没有完整的解决方案,只是一个想法。我的想法是使覆盖视图与注释视图具有相同的超视图,并确保注释将放置在覆盖图上。在MKMapViewDelegate我们实行:

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

此代码你想要什么半 - 你配置的地图瓦片和注释之间的视图。剩下的任务是根据地图滚动/缩放更改自定义覆盖视图框架(如果找到方法,我会发布)。

+0

很好的答案,这对于我们想要地图上的渐变但是希望引脚脱颖而出的叠加层也很有效。 – 2016-08-15 20:39:35

0

这是非常古老的,但也许仍然有一些你。

我想让地图变暗,但不是注释视图。

我做了很简单,我还不知道,如果它有一些回退...

我把UIView采用了黑色透明背景的MKMapView以上,然后添加以下代码:

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

希望它可以帮助..当然还有 - 如果你发现这个解决方案的任何问题,请让我知道:)

编辑#1: 忘了提及self.viewDark应该有userInteraction禁用。

编辑#2: 另一件事,让我被设置self.viewDarkautoresizesSubviewsNO

1

我做了类似的事情,最终以不同的方式。我想通过添加一个白色叠加层淡出mapview,但我不想淡化注释。我在地图上添加了覆盖图(实际上,我不得不添加两个覆盖图,因为它不像我想为整个地球添加覆盖图)。

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]; 

然后你需要添加地图委托吸引他们:

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