自定义MKAnnotationView标注
我想创build一个自定义的MKAnnotationView标注,如图所示。 我已经testing了几个解决scheme,但他们只允许定制左/右图像和标题/副标题。 任何人都可以给我一些源代码或教程链接吗?
目前我无能为力。 请帮忙。
我知道你想要一个自定义标注的图钉。
我们无法创build自定义标注,但我们可以使用完全自定义的视图创build注释。 所以诀窍是当第一个被选中时添加第二个注释,并使第二个注释视图看起来像一个标注泡泡。
这是用户djibouti33和jacob- jennings在答案中发布的解决scheme: MKAnnotationView – locking自定义注释视图以固定位置更新 ,而这些视图依次位于Asynchrony Solutions的博客文章中 。 为了解释的目的,下面是一个分叉项目的UML:
这是一个很大的黑客,但也是我见过的实现自定义注释的最干净的方式。
从一个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视图类似,如上所示。