gpt4 book ai didi

iphone - 自定义 MKAnnotationView 标注

转载 作者:IT王子 更新时间:2023-10-29 07:39:36 28 4
gpt4 key购买 nike

我想创建一个自定义 MKAnnotationView 标注,如此图所示。我已经测试了几种解决方案,但它们只允许自定义左/右图像和标题/副标题。谁能给我一些源代码或教程链接吗?

目前我一无所知。请帮忙。

enter image description here

最佳答案

我知道您想要一个带有自定义标注的图钉。

我们无法创建自定义标注,但我们可以创建具有完全自定义 View 的注释。所以诀窍是在选择第一个注释时添加第二个注释,并使第二个注释 View 看起来像一个标注气泡。

这是用户发布的解决方案djibouti33jacob-jennings在答案中:MKAnnotationView - Lock custom annotation view to pin on location updates ,它又基于 blog post来自异步解决方案。出于解释的目的,这里有一些来自 fork 项目的 UML: Annotation with custom XIB

这是一个大 hack,但也是我见过的实现自定义注释的最干净的方法。

从一个 NSObject“Content”类开始,它有一个坐标,要使用的标注 View 的类(在 UML 中是 AnnotationView,但您可以创建更多并在此处设置它们),以及一个随机值的字典标题、照片 url 等。使用此类初始化 MKAnnotation“注释”对象。

#import <MapKit/MapKit.h>
@interface Content : NSObject
@property (nonatomic,assign) CLLocationCoordinate2D coordinate;
// ...

@interface Annotation : NSObject <MKAnnotation, AnnotationProtocol>
-(id) initWithContent:(Content*)content;
// ...

Annotation 实现 AnnotationProtocol 以宣布它要处理自己的 MKAnnotationView 的创建。也就是说,您的 MKMapViewDelegate 应该有这样的代码:

- (MKAnnotationView *)mapView:(MKMapView *)aMapView viewForAnnotation:(id<MKAnnotation>)annotation 
{
// if this is a custom annotation, delegate the implementation of the view
if ([annotation conformsToProtocol:@protocol(AnnotationProtocol)]) {
return [((NSObject<AnnotationProtocol>*)annotation) annotationViewInMap:mapView];
} else {
// else, return a standard annotation view
// ...
}
}

返回的 View 将是 AnnotationView 类型,它实现了 AnnotationViewProtocol 以宣布它要处理选择/取消选择。因此,在您的 map View Controller 中,方法 mapView:didSelectAnnotationView: 和 mapView:didDeselectAnnotationView: 应该以与我们之前看到的类似的方式委托(delegate)。

当注释被选中时,第二个注释 (CalloutAnnotation) 被添加,它遵循相同的行为,但这次返回的 View (CalloutView) 是从 XIB 初始化的,并且包含 Core Graphics 代码(在 BaseCalloutView 中)以进行动画处理并复制标注。

CalloutView 类的初始化器:

- (id)initWithAnnotation:(CalloutAnnotation*)annotation
{
NSString *identifier = NSStringFromClass([self class]);
self = [super initWithAnnotation:annotation reuseIdentifier:identifier];
if (self!=nil){
[[NSBundle mainBundle] loadNibNamed:identifier owner:self options:nil];
// prevent the tap and double tap from reaching views underneath
UITapGestureRecognizer *tapGestureRecognizer = ...
}
return self;
}

为了能够从标注 View 中推送另一个 View Controller ,我使用了通知。

我在顶部链接的 SO 答案包含两个实现此代码的完整项目(类名可能不同)。我在 https://github.com/j4n0/callout 有另一个项目使用上面的 UML .

关于iphone - 自定义 MKAnnotationView 标注,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8018841/

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