2011-01-17 27 views
14

Tôi đã thiết lập NSMutableArray của các đối tượng bắt nguồn từ một lớp phù hợp với giao thức MKAnnotation. Tôi có tiêu đề thiết lập cài đặt và phụ đề cho các chú thích và đã thêm thành công chúng đến MKMapView sử dụng:MKMapView, animateDrop?

[[self customMapView] addAnnotations:locationArray]; 

Những gì tôi muốn làm bây giờ là animate chân rơi, ban đầu tôi nghĩ tôi có thể làm điều đó với OPTION1 , bằng cách sử dụng tất cả mọi thứ hoạt động, nhưng các chân không làm một thả hoạt hình.

// Option1 
// WORKS FOR: pinColor YES, animatesDrop NO, LABEL YES 
- (void)mapView:(MKMapView *)mapView didAddAnnotationViews:(NSArray *)views { 
    for(MKPinAnnotationView *eachView in views) { 
     [eachView setAnimatesDrop:YES]; 
     [eachView setPinColor:MKPinAnnotationColorPurple]; 
    } 
} 

đoán tiếp theo của tôi là cố gắng OPTION2, điều này dường như làm việc rất tốt nhưng tôi có hai vấn đề. Tiêu đề và phụ đề không hiển thị, đối tượng chú thích tùy chỉnh của tôi đang được truyền vào (tôi có thể nhìn thấy nó trong trình gỡ lỗi) nhưng thông tin chứa không được chuyển sang đối tượng mới pin. Thứ hai, điều này tạo ra một bộ mới của MKAnnotationViews, những gì sẽ xảy ra với những cái cũ, có và các vấn đề với rò rỉ bộ nhớ?

// Option2 
//FOR: pinColor YES, animatesDrop YES, LABEL NO 
- (MKAnnotationView *) mapView: (MKMapView *) mapView viewForAnnotation: (id<MKAnnotation>) annotation { 
    MKPinAnnotationView *pin = (MKPinAnnotationView *) [mapView dequeueReusableAnnotationViewWithIdentifier: @"annotation_ID"]; 
    if (pin == nil) { 
     pin = [[[MKPinAnnotationView alloc] initWithAnnotation: annotation reuseIdentifier: @"annotation_ID"] autorelease]; 
    } else { 
     pin.annotation = annotation; 
    } 
    pin.pinColor = MKPinAnnotationColorRed; 
    pin.animatesDrop = YES; 
    return pin; 
} 

EDIT: Tôi đã giải quyết được thiếu tiêu đề & phụ đề bằng cách thêm pin.canShowCallout = YES;

+1

Trong mã phương án 2 của bạn, khi pin được tạo ra nó sẽ không có tập chú thích. Tôi sẽ xóa "else" và thụt lề dòng ghi chú pin.annotation =, để nó luôn được thiết lập. – theLastNightTrain

Trả lời

32

MKPinAnnotationView là một lớp con của MKAnnotationView.

MKAnnotationView là chế độ xem chú thích chung mà bạn phải cung cấp hình ảnh và hoạt ảnh nếu muốn.

MKPinAnnotationView là một lớp con thuận tiện của MKAnnotationView tự động cung cấp hình ảnh pin trong màu đã chọn và hoạt ảnh của ghim thả xuống bản đồ. Bạn đặt thuộc tính animatesDrop khi tạo khung nhìn trong viewForAnnotation và nó sẽ tự động xử lý hoạt ảnh từ đó.

Nếu bạn không triển khai viewForAnnotation, một ghim màu đỏ chuẩn không có hình động sẽ được hiển thị.

Vào lúc didAddAnnotationXem được gọi, hoạt ảnh tự động đã xảy ra và cài đặt thuộc tính đó không có hiệu lực.

Nếu bạn muốn tạo hoạt ảnh tùy chỉnh khác với hoạt ảnh thả mặc định mà MKPinAnnotationView cung cấp, bạn có thể làm điều đó trong didAddAnnotationViews. Chế độ xem sẽ có tại điểm đích cuối cùng của nó, do đó bạn lưu điểm đến và sau đó tạo hiệu ứng đó từ một điểm khác đến điểm đến đó.

Nếu bạn hài lòng với hoạt ảnh thả mặc định mà MKPinAnnotationView cung cấp, bạn không cần triển khai didAddAnnotationViews. Phương thức ủy nhiệm đó hữu ích hơn khi thực hiện những việc khác mà bạn có thể cần thực hiện khi tất cả các chế độ xem chú thích thực sự được thực hiện.

Để ghim hiển thị tiêu đề, hãy đặt canShowCallout thành YES nơi bạn đặt animatesDrop.

Không chắc chắn ý của bạn là gì "điều này tạo ra một tập hợp mới của MKAnnotationViews". Trong phương thức viewForAnnotation, bạn đang cung cấp một khung nhìn (MKPinAnnotationView) cho đối tượng MKAnnotation. Chúng không giống nhau.

Ngoài ra, phương pháp viewForAnnotation hoạt động giống như các phương pháp cellForRowAtIndexPath cho UITableView nơi chú thích xem có thể được tái chế đó là lý do tại sao điều quan trọng là để thiết lập thông tin MKAnnotation cụ thể trong giao diện mỗi lần (chẳng hạn như bất động sản chú thích).

+0

Cảm ơn bạn aBitObvoius, một câu trả lời hoàn hảo. Liên quan đến MKAnnotationViews, tôi đã nhầm lẫn khi nghĩ rằng nếu bạn không triển khai viewForAnnotation (nơi bạn nhận được các chân đỏ mặc định) có thể đã có một MKAnnotationView được tạo ở đâu đó và sau đó thực hiện nó, tôi có thể cần phải làm gì đó với một. – fuzzygoat

+0

Ok, bằng cách triển khai viewForAnnotation, bạn sẽ ghi đè chế độ xem mặc định để không có trùng lặp. – Anna

+0

Hiểu rồi, cảm ơn rất nhiều, cảm ơn một lần nữa vì một câu trả lời rất hữu ích. – fuzzygoat

11

Đây là giải pháp đơn giản nhất tôi có thể tìm thấy. Những gì nó làm là giảm một pin duy nhất trên UIMapView trong sự kiện viewDidLoad.

  1. Dự án tham chiếu MapKit khuôn khổ

  2. Quan điểm có việc nhập khẩu như sau: #import <MapKit/MapKit.h>

  3. Bộ điều khiển xem thực hiện MKMapViewDelegate giao thức

  4. Việc thực hiện quan điểm điều khiển bao gồm:

- (MKAnnotationView *) mapView:(MKMapView *)mapView viewForAnnotation:(id) annotation 
{ 
    MKPinAnnotationView *newAnnotation = [[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"annotation1"]; 
    newAnnotation.pinColor = MKPinAnnotationColorGreen; 
    newAnnotation.animatesDrop = YES; 
    newAnnotation.canShowCallout = NO; 
    [newAnnotation setSelected:YES animated:YES]; 
    return newAnnotation; 
} 
  1. Các viewDidLoad chứa:
CLLocationCoordinate2D geos = CLLocationCoordinate2DMake(0.2344, 45.324); 
MKPlacemark* marker = [[MKPlacemark alloc] initWithCoordinate:geos addressDictionary:nil]; 
[mapView addAnnotation:marker]; 
[marker release]; 
+1

Trong viewForAnnotation :, bạn có nghĩa vụ phải sử dụng mapView.dequeueReusableAnnotationViewWithIdentifier, giống như cách bạn sử dụng dequeueReusableCellWithIdentifier trong một tableView. Nếu không, bạn tiếp tục tạo MKAnnotations bằng mã định danh tái sử dụng mà bạn không thực sự sử dụng lại. –

+0

Bạn chọn chú thích trong viewForAnnotation có vẻ khá vô nghĩa. – Andy

0

Cập nhật Swift3:

func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? { 

    if annotation is MKUserLocation { 
    return nil 
    } 

    let pinAnnotation = MKPinAnnotationView(annotation: annotation, reuseIdentifier: "PinAnnotation") 
    pinAnnotation.pinTintColor = .green; 
    pinAnnotation.animatesDrop = true; 
    pinAnnotation.canShowCallout = false; 
    pinAnnotation.setSelected(true, animated: true) 

    return pinAnnotation 
} 
Các vấn đề liên quan