2010-11-06 6 views
10

Tôi có một tập hợp các chú thích dữ liệu có thể cập nhật rất nhanh. Hiện tại, tôi xóa tất cả các chú thích trước khi thêm lại chúng vào bản đồ.MKMapView di chuyển chú thích Tự động - animate chúng?

NSArray *existingpoints = [mapView.annotations filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"!(self isKindOfClass: %@)", [MKUserLocation class]]]; 
[mapView removeAnnotations:existingpoints]; 

Tôi tính chúng ở đâu trong đối tượng tùy chỉnh để có thể gọi điều này và "di chuyển" chú thích mà không xóa và thêm lại nó vào bản đồ. Cuộc gọi ví dụ mà tôi thực hiện có tác dụng và tôi muốn gần như "cuộc thăm dò ý kiến" ở bên dưới.

- (CLLocationCoordinate2D) coordinate 
{ 
    CLLocationCoordinate2D coord; 
    coord.latitude = [lat doubleValue]; 
    coord.longitude = [lon doubleValue]; 


     double differencetime = exampleTime; 
     double speedmoving; 
     double distanceTravelled = speedmoving * differencetime; 

     CLLocationDistance movedDistance = distanceTravelled; 
     double radiansHeaded = DEG2RAD([self.heading doubleValue]); 
     CLLocation *newLocation = [passedLocation newLoc:movedDistance along:radiansHeaded]; 
     coord = newLocation.coordinate; 

    return coord; 
} 

Theo yêu cầu, các tập tin .h của Object, tôi không có một phương pháp SetCoordinate ..

#import <Foundation/Foundation.h> 
#import <CoreLocation/CoreLocation.h> 
#import <MapKit/MapKit.h> 

@interface TestObject : NSObject <MKAnnotation>{ 
    NSString *adshex; 
    NSString *lat; 
    NSString *lon; 


    NSString *title; 
    NSString *subtitle; 


    CLLocationCoordinate2D coordinate; 
} 
@property(nonatomic,retain)NSString *adshex; 
@property(nonatomic,retain)NSString *lat; 
@property(nonatomic,retain)NSString *lon; 


@property(nonatomic,retain)NSString *title; 
@property(nonatomic,retain)NSString *subtitle; 
@property (nonatomic, readonly) CLLocationCoordinate2D coordinate; 


- (CLLocationCoordinate2D) coordinate; 

@end 
+0

Bạn có phương thức setCoordinate trong đối tượng chú thích của mình hay chỉ là phương thức phối hợp? Hiển thị tệp .h cho đối tượng chú thích của bạn. – Anna

+0

Không, tôi không thêm, .h vào bản chỉnh sửa –

Trả lời

20

Nếu bạn cập nhật các chú thích của phối hợp sử dụng một phương pháp setCoordinate (hoặc tương đương), các chế độ xem bản đồ sẽ tự động cập nhật vị trí của chú thích trên chế độ xem. This page trong các tài liệu nói như sau:

Chú ý: Khi bạn thực hiện các phối hợp tài sản trong lớp học của bạn, nó bạn nên tổng hợp tạo của nó. Nếu bạn chọn triển khai các phương pháp cho thuộc tính này chính mình hoặc nếu bạn sửa đổi thủ công biến nằm bên dưới thuộc tính đó trong các phần khác của lớp học của bạn sau khi thêm chú thích vào bản đồ, -giá trị thông báo quan sát (KVO) khi bạn thực hiện. Bộ bản đồ sử dụng thông báo KVO để phát hiện các thay đổi đối với toạ độ, tiêu đề và thuộc tính phụ đề của các chú thích và thực hiện bất kỳ thay đổi nào cần thiết thay đổi đối với hiển thị bản đồ. Nếu bạn làm không gửi thông báo KVO, vị trí chú thích của bạn có thể không được cập nhật đúng trên bản đồ.

Chế độ xem bản đồ sẽ chỉ biết đọc lại thuộc tính tọa độ của chú thích nếu được thông báo (qua KVO) mà tọa độ đã thay đổi. Một cách để làm điều đó là thực hiện một phương thức setCoordinate và gọi bất cứ nơi nào bạn có mã cập nhật vị trí của chú thích.

Trong mã của bạn, bạn đang tính toán lại tọa độ trong chính thuộc tính tọa độ chỉ đọc. Những gì bạn có thể làm là thêm video này vào tập tin chú thích .m (và đến h):

- (void)setCoordinate:(CLLocationCoordinate2D)newCoordinate 
{ 
    //do nothing 
} 

và ở nơi mà bạn cập nhật địa điểm, gọi phương thức setCoordinate trên chú thích:

[someAnnotation setCoordinate:someAnnotation.coordinate]; 

Bạn có thể thực hiện việc này ở nơi bạn hiện đang xóa/thêm lại chú thích.

Cuộc gọi ở trên có vẻ buồn cười vì bạn có tọa độ tính lại calc theo phương thức phối hợp-getter. Mặc dù nó sẽ hoạt động như một bản sửa lỗi/kiểm tra nhanh, tôi không khuyên bạn nên sử dụng nó thường xuyên.

Thay vào đó, bạn có thể calc lại vị trí của chú thích bên ngoài (nơi bạn hiện đang xóa/thêm lại chú thích) và chuyển toạ độ mới thành setCoordinate.Đối tượng chú thích của bạn có thể lưu trữ vị trí mới của nó trong các lat/lng ivars bạn hiện có (đặt chúng trong setCoordinate và chỉ sử dụng những cái để tạo CLLocationCoordinate2D để trở về từ getter) hoặc (tốt hơn) sử dụng phối hợp ivar (đặt nó trong setCoordinate và trả lại nó trong getter).

+0

Liên kết tới ghi chú "Quan trọng" đã thay đổi: https://developer.apple.com/library/ios/documentation/userexperience/conceptual/LocationAwarenessPG/AnnotatingMaps/AnnotatingMaps .html # // apple_ref/doc/uid/TP40009497-CH6-SW2 – Anna

+0

Thật không may là nó không tạo hiệu ứng chuyển tiếp. Có ai biết cách nào để di chuyển một chú thích hoạt hình không? – devios1

+2

Tìm hiểu cách thực hiện. Xem http://stackoverflow.com/a/8564097/238948 – devios1