2009-10-26 57 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; 
}