自定义MKAnnotationView标注

我想创build一个自定义的MKAnnotationView标注,如图所示。 我已经testing了几个解决scheme,但他们只允许定制左/右图像和标题/副标题。 任何人都可以给我一些源代码或教程链接吗?

目前我无能为力。 请帮忙。

在这里输入图像描述

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

我们无法创build自定义标注,但我们可以使用完全自定义的视图创build注释。 所以诀窍是当第一个被选中时添加第二个注释,并使第二个注释视图看起来像一个标注泡泡。

这是用户djibouti33和jacob- jennings在答案中发布的解决scheme: MKAnnotationView – locking自定义注释视图以固定位置更新 ,而这些视图依次位于Asynchrony Solutions的博客文章中 。 为了解释的目的,下面是一个分叉项目的UML: 自定义XIB的注释

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

从一个NSObject的“Content”类开始,它有一个坐标,要使用的调用视图的类(在UML中是AnnotationView,但是你可以在这里创build更多的),以及一个随机值的字典,标题,照片url等。使用这个类来初始化一个MKAnnotation“Annotation”对象。

#import <MapKit/MapKit.h> @interface Content : NSObject @property (nonatomic,assign) CLLocationCoordinate2D coordinate; // ... @interface Annotation : NSObject <MKAnnotation, AnnotationProtocol> -(id) initWithContent:(Content*)content; // ... 

Annotation实现了AnnotationProtocol来宣布它想要处理自己的MKAnnotationView的创build。 也就是说,你的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 // ... } } 

返回的视图将是AnnotationViewtypes的,它实现了AnnotationViewProtocol来通知它要处理select/取消select。 因此,在您的地图视图控制器中,方法mapView:didSelectAnnotationView:和mapView:didDeselectAnnotationView:应该以类似的方式委托给我们之前看到的。

当select注释时,会添加第二个注释(CalloutAnnotation),该注释遵循相同的行为,但是这次从XIB初始化返回的视图(CalloutView),并且包含Core Graphics代码(在BaseCalloutView中)以animation和复制大喊。

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; } 

为了能够从标注视图中推送另一个视图控制器,我使用了通知。

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

我在MKAnnotationView中添加了自定义的UIButton。 并点击该button,我已经显示popup与rootViewController视图类似,如上所示。