2011-11-05 32 views
41

Tôi muốn tạo chú thích tùy chỉnh MKAnnotationView như minh họa trong hình ảnh này. Tôi đã thử nghiệm một số giải pháp nhưng họ chỉ cho phép tùy chỉnh hình ảnh bên trái/phải và tiêu đề/phụ đề. Ai có thể vui lòng cho tôi một số mã nguồn hoặc liên kết hướng dẫn cho nó?Tùy chỉnh chú thích MKAnnotationView

Hiện tại tôi không thể tránh khỏi. Hãy giúp tôi.

enter image description here

+0

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

+1

Câu hỏi rất hay .. Nó cũng giúp tôi .. Cảm ơn rất nhiều Jennis .. –

+0

Bản trình diễn mẫu - http://stackoverflow.com/questions/27519517/button-action-in-mkannotation-view-not-working/27519673#27519673 – Kampai

Trả lời

49

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 djibouti33jacob-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: Annotation with custom XIB

Đâ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.

+0

Xin chào, Cảm ơn vì công việc tuyệt vời mà bạn đã làm. Tôi đang cố tạo chú thích vì sao có hai nút trong đó. Khi tôi nhấp vào nút, xử lý methodeTouch của lớp con CalloutView của tôi được gọi. Nhưng người gửi là một UITapGestureRecognizer với chú thích trong thuộc tính khung nhìn mà tôi đã dự kiến ​​sẽ có nút của tôi trong sender.view? Đây có phải là vấn đề được biết đến hay không. Hay tôi đang làm gì sai? –

+0

Có, đã biết, hãy kiểm tra https://github.com/j4n0/callout/issues/1 để biết giải pháp. – Jano

+0

Tôi đang gặp phải vấn đề khi triển khai mã này, bất kỳ ai cũng có thể giúp tôi .. –

0

Tôi đã thêm UIButton tùy chỉnh trong MKAnnotationView. Và khi nhấp vào nút đó, tôi đã hiển thị popOver với rootViewController với chế độ xem tương tự như bạn đã hiển thị ở trên.

Các vấn đề liên quan