对于我正在构建的应用,我有一个自定义的“旧地图”效果PNG,我想在MKMapView视图上叠加。不幸的是,我试图做到这一点的方式都不正确:
我基本上想要完成的是一个子视图,它位于maptiles上方,但在注释视图下方,并且在用户滚动时会保持稳定 - 任何想法?
答案 0 :(得分:4)
请注意,所有MKMapView
子视图层次结构,注释,行为等都在内部私有MKMapViewInternal类中进行,因此在此结构中更改任何内容(以我建议的方式或其他方式)可能会导致您的应用程序被拒绝来自Appstore。
我没有完整的解决方案,只是一个想法。我的想法是使叠加视图与注释视图具有相同的超视图,并确保将注释放在叠加层上。在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];
}
}
此代码可以实现您想要的一半 - 您可以在地图图块和注释之间放置视图。剩下的任务是根据地图滚动/缩放来更改自定义叠加视图框(如果找到方法,我会发布)。
答案 1 :(得分: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;
}
答案 2 :(得分: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.viewDark
&#39; autoresizesSubviews
设置为NO
。