Iphone 将子视图添加到';在地图上方但在注释视图下方?
对于我正在构建的一个应用程序,我有一个自定义的“旧地图”效果PNG,我想覆盖在MKMapView视图上。不幸的是,我尝试的两种方法都不完全正确:Iphone 将子视图添加到';在地图上方但在注释视图下方?,iphone,overlay,mkmapview,subview,Iphone,Overlay,Mkmapview,Subview,对于我正在构建的一个应用程序,我有一个自定义的“旧地图”效果PNG,我想覆盖在MKMapView视图上。不幸的是,我尝试的两种方法都不完全正确: 在MKMapView中添加一个子视图(问题:PNG的UIImageView被放置在注释引脚上方,这看起来很奇怪 将图像本身设置为注释视图,并将其放置在其他图像的下方(问题:在滚动时,我必须移动注释视图图像,在一段时间内,只有常规贴图而不是旧时效果) 我基本上想要实现的是拥有一个子视图,该子视图分层在maptiles的上方,但在注释视图的下方,当用户滚动
我基本上想要实现的是拥有一个子视图,该子视图分层在maptiles的上方,但在注释视图的下方,当用户滚动任何想法时,该子视图将保持稳定?请注意,所有
MKMapView
子视图层次结构、注释、行为等都在内部私有类中进行,因此可以更改任何内容(在某种程度上,我建议)此结构可能会导致您的应用程序被Appstore拒绝。我没有一个完整的解决方案,只是一个想法。我的想法是使覆盖视图与注释视图具有相同的superview,并确保注释将放置在覆盖视图上。在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];
}
}
这段代码只完成了您想要的一半-您可以在地图分幅和注释之间获得一个视图。剩下的任务是根据地图滚动/缩放更改自定义覆盖图框架(如果我找到了方法,我会发布)。这段代码很旧,但可能仍然与您中的一些人相关 我想使地图更暗,但不是注释视图 我所做的很简单,我还不知道它是否有一些退路 我在
MKMapView
上方放置了一个黑色透明背景的UIView
,然后添加了以下代码:
- (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];
}
}
-(void)mapView:(MKMapView*)mapView添加注释视图:(NSArray*)视图
{
用于(MKAnnotationView*视图中的视图){
view.center=[self.mapView convertCoordinate:view.annotation.coordinate toPointToView:self.viewDark];
[self.viewDark addSubview:view];
}
}
希望对您有所帮助。当然,如果您发现此解决方案存在任何问题,请告诉我:)
编辑#1:
忘了提到self.viewDark
应该禁用userInteraction
编辑#2:
另一件对我有帮助的事情是将
self.viewDark
的autoresizesSubviews
设置为NO
,我做了一些类似的事情,最后以不同的方式完成了。我想通过添加白色覆盖来淡出地图视图,但我不想淡出注释。我在地图上添加了一个覆盖(事实上,我不得不添加两个,因为它不喜欢我尝试为整个地球添加覆盖)
然后,您需要添加映射代理来绘制它们:
- (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;
}
-(mkoverlayrender*)地图视图:(MKMapView*)地图视图渲染器foroverlay:(id)overlay{
if([overlay iskindof类:MKPolygon.class]){
MKPolygonRenderer*polygonView=[[MKPolygonRenderer alloc]initWithOverlay:overlay];
polygonView.fillColor=[UIColor COLOR WITHRED:255.0/255.0绿色:255.0/255.0蓝色:255.0/255.0 alpha:0.4];
返回polygonView;
}
返回零;
}
Wow,这是一个没有答案的老问题。+1我需要这个,有人知道了吗?答案不错,这对覆盖效果也很好,我们希望在地图上有一个渐变,但希望图钉突出。
- (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;
}