gpt4 book ai didi

iphone - 如何在 map 注释标注中添加自定义 View

转载 作者:行者123 更新时间:2023-12-03 18:15:03 25 4
gpt4 key购买 nike

这是我的代码。我想添加我自己的自定义标注 View 而不是 iOS 默认 View 。我知道只有左标注和右标注 View ,但我需要添加带有我自己的背景和标签的 View 工具提示类型。

    - (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation
{
MKAnnotationView *userAnnotationView = nil;
if ([annotation isKindOfClass:MKUserLocation.class])
{
userAnnotationView = (MKAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:@"UserLocation"];
if (userAnnotationView == nil) {
userAnnotationView = [[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"UserLocation"];
}
else
userAnnotationView.annotation = annotation;

userAnnotationView.enabled = YES;


userAnnotationView.canShowCallout = YES;
userAnnotationView.image = [UIImage imageNamed:@"map_pin.png"];
UIView *view = [[UIView alloc]initWithFrame:CGRectMake(0,0,141,108)];
view.backgroundColor = [UIColor clearColor];
UIImageView *imgView = [[UIImageView alloc]initWithImage:[UIImage imageNamed:@"toltip.png"]];
[view addSubview:imgView];
userAnnotationView.leftCalloutAccessoryView = view;



return userAnnotationView;
}

}

Image for reference

最佳答案

我遇到了同样的问题,最终做了以下事情:

当我收到mapView委托(delegate)回调时

-(void)mapView:(MKMapView *)mapView didSelectAnnotationView:(MKAnnotationView *)view

(现在是我想要显示我的自定义 CalloutView 的时候了)

我使用作为参数接收的 View *(MKAnnotationView )view(这是一个引脚 View ),然后使用

将我的自定义 View 添加到该引脚 View
 [view addSubview:customView];

它将在该 pin View 之上添加您的自定义 View ,因此如果我们希望它位于 pin 之上,我们必须更改自定义 View 中心属性,如下所示:

CGRect customViewRect = customView.frame;
CGRect rect = CGRectMake(-customViewRect.size.width/2, -customViewRect.size.height-7, customViewRect.size.width, customViewRect.size.height);
customView.frame = rect;
[view addSubview:customView];

就我而言,它看起来像这样

enter image description here

!注意:

有一个警告可以轻松修复,您的自定义 View 将忽略触摸事件,因为ma​​pView以不同的方式处理触摸。这是一个快速修复:

1)子类MKAnnotationView(或MKPinAnnotationView取决于您的需要)

2) 在你的mapView委托(delegate)中

- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation

使用您的子类而不是 MKAnnotationView/MKPinAnnotationView

3) 在子类 .m 文件中重写以下两个方法:

- (UIView*)hitTest:(CGPoint)point withEvent:(UIEvent*)event
{
UIView* hitView = [super hitTest:point withEvent:event];
if (hitView != nil)
{
[self.superview bringSubviewToFront:self];
}
return hitView;
}

- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent*)event
{
CGRect rect = self.bounds;
BOOL isInside = CGRectContainsPoint(rect, point);
if(!isInside)
{
for (UIView *view in self.subviews)
{
isInside = CGRectContainsPoint(view.frame, point);
if(isInside)
break;
}
}
return isInside;
}

全部完成!

关于iphone - 如何在 map 注释标注中添加自定义 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15241340/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com