2011-11-05 87 views
41

我想創建一個自定義的MKAnnotationView標註,如圖所示。我已經測試了幾個解決方案,但他們只允許定製左/右圖像和標題/副標題。任何人都可以給我一些源代碼或教程鏈接嗎?自定義MKAnnotationView標註

目前我無能爲力。請幫忙。

enter image description here

+0

我認爲這只是一個自定義視圖,您的真正問題是什麼? – Mat

+1

很好的問題..它也幫助我..非常感謝Jennis .. –

+0

示例演示 - http://stackoverflow.com/questions/27519517/button-action-in-mkannotation-view-not-working/27519673#27519673 – Kampai

回答

49

我知道你想用一個自定義的標註引腳。

我們無法創建自定義標註,但我們可以使用完全自定義的視圖創建標註。所以訣竅是在第一個選擇時添加第二個註釋,並使第二個註釋視圖看起來像一個標註泡泡。

這是用戶發佈的djibouti33和答案jacob-jennings解決方案:MKAnnotationView - Lock custom annotation view to pin on location updates,而這又是基於從異步性解決方案一個blog post。出於解釋的目的,這裏是一些分叉項目的UML: Annotation with custom XIB

這是一個很大的破解,但也是我見過的實現自定義註釋的最乾淨的方式。

以一個NSObject「Content」類開頭,該類有一個座標,要使用的調用視圖的類(在UML中是AnnotationView,但您可以創建更多並在此處設置它們)以及隨機值的字典標題,照片網址等。使用此類來初始化MKAnnotation「Annotation」對象。

#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初始化的,並且包含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; 
} 

爲了能夠從我用通知標註視圖推另一個視圖控制器。

我在頂部鏈接的SO答案包含兩個完成此代碼的完整項目(類名稱可能不同)。我有另一個項目使用上面的UML https://github.com/j4n0/callout

+0

你好, 感謝您所做的出色工作。 我想創建一個註釋爲什麼兩個按鈕在它。 當我點擊按鈕時,我的CalloutView子類的方法handleTouch被調用。但發件人是一個UITapGestureRecognizer與視圖屬性中的註釋我期望有我的按鈕到sender.view? 這是一個衆所周知的問題。或者我做錯了什麼? –

+0

是的,衆所周知,請查看https://github.com/j4n0/callout/issues/1以獲取解決方案。 – Jano

+0

我面臨的問題來執行此代碼可以任何人幫助我.. –

0

我在MKAnnotationView中添加了自定義的UIButton。然後點擊那個按鈕,我就看到popView與RootViewController的視圖類似,如上所示。