我想创建一个自定义的MKAnnotationView弹出窗口,就像这张图片中显示的那样。我已经尝试过几种方案,但它们只允许自定义左/右图像和标题/副标题。有没有人能给我一些源代码或教程链接呢?
目前我一头雾水,请帮帮我。
我想创建一个自定义的MKAnnotationView弹出窗口,就像这张图片中显示的那样。我已经尝试过几种方案,但它们只允许自定义左/右图像和标题/副标题。有没有人能给我一些源代码或教程链接呢?
目前我一头雾水,请帮帮我。
#import <MapKit/MapKit.h>
@interface Content : NSObject
@property (nonatomic,assign) CLLocationCoordinate2D coordinate;
// ...
@interface Annotation : NSObject <MKAnnotation, AnnotationProtocol>
-(id) initWithContent:(Content*)content;
// ...
该注释实现了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
// ...
}
}
返回的视图将是AnnotationView类型,它实现了AnnotationViewProtocol以宣布它想要处理选择/取消选择。因此,在您的地图视图控制器中,方法mapView:didSelectAnnotationView:和mapView:didDeselectAnnotationView:应该以类似于我们之前看到的方式委托。
当注释被选中时,会添加第二个注释(CalloutAnnotation),其遵循相同的行为,但这次返回的视图(CalloutView)是从XIB初始化的,并包含核心图形代码(在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;
}
为了能够从标注视图中推出另一个视图控制器,我使用了通知。
我在顶部链接的SO答案中包含了两个完整的项目,实现了这段代码(类名可能不同)。我还有另一个使用上述UML的项目,位于https://github.com/j4n0/callout。
我知道这个问题是来自2011年的,但是对于那些在搜索中仍然找到它的人:
在iOS 9中,你有MKAnnotationView.detailCalloutAccessoryView
,它完全替代了标准的弹出框。