Tôi hiểu bạn muốn có một pin với một chú thích tùy chỉnh.
Chúng tôi không thể tạo chú thích tùy chỉnh nhưng chúng tôi có thể tạo chú thích với chế độ xem được tùy chỉnh hoàn toàn. Vì vậy, mẹo là thêm chú thích thứ hai khi chú thích đầu tiên được chọn và làm cho chế độ xem chú thích thứ hai trông giống như bong bóng chú thích.
Đây là giải pháp được đăng bởi người dùng djibouti33 và jacob-jennings trong câu trả lời: MKAnnotationView - Lock custom annotation view to pin on location updates, lần lượt có trụ sở tại số blog post từ Giải pháp không đồng bộ. Vì mục đích giải thích, dưới đây là một số UML từ một dự án được chia đôi: 
Đây là một cách hack lớn nhất, nhưng tôi vẫn thấy cách thực hiện chú thích tùy chỉnh.
Bắt đầu với lớp "Nội dung" NSObject có toạ độ, lớp của chế độ xem chú thích để sử dụng (trong UML là AnnotationView, nhưng bạn có thể tạo thêm và đặt chúng ở đây) và từ điển các giá trị ngẫu nhiên tiêu đề, url ảnh, v.v. Sử dụng lớp này để khởi tạo đối tượng "Chú giải" MKAnnotation.
#import <MapKit/MapKit.h>
@interface Content : NSObject
@property (nonatomic,assign) CLLocationCoordinate2D coordinate;
// ...
@interface Annotation : NSObject <MKAnnotation, AnnotationProtocol>
-(id) initWithContent:(Content*)content;
// ...
Chú thích triển khai Chú thíchProtocol để thông báo muốn xử lý việc tạo MKAnnotationView của riêng nó. Đó là, MKMapViewDelegate của bạn cần phải có mã như thế này:
- (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
// ...
}
}
Quan điểm trở lại sẽ là loại AnnotationView, mà thực hiện AnnotationViewProtocol mừng thông báo rằng nó muốn để xử lý lựa chọn/deselection. Do đó, trong bộ điều khiển xem bản đồ của bạn, các phương thức mapView: didSelectAnnotationView: và mapView: didDeselectAnnotationView: nên ủy nhiệm theo cách tương tự với những gì chúng ta đã thấy trước đây.
Khi chú thích được chọn, chú thích thứ hai (CalloutAnnotation) được thêm vào, theo sau hành vi tương tự, nhưng lần này trở lại (CalloutView) được khởi tạo từ XIB và chứa mã đồ họa lõi (trong BaseCalloutView) animate và tái tạo chú thích.
Các initializer của lớp 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;
}
Để có thể đẩy một bộ điều khiển nhìn từ quan điểm callout Tôi đã từng thông báo.
Câu trả lời SO tôi liên kết ở trên cùng chứa hai dự án hoàn thành triển khai mã này (tên lớp có thể khác nhau). Tôi có một dự án khác sử dụng UML ở trên tại https://github.com/j4n0/callout.
Tôi nghĩ rằng đây chỉ là chế độ xem tùy chỉnh với ghim tùy chỉnh, vấn đề thực sự của bạn là gì? – Mat
Câu hỏi rất hay .. Nó cũng giúp tôi .. Cảm ơn rất nhiều Jennis .. –
Bản trình diễn mẫu - http://stackoverflow.com/questions/27519517/button-action-in-mkannotation-view-not-working/27519673#27519673 – Kampai