Tôi có một bản đồ và một bộ chú thích, mỗi chú thích có thuộc tính 'cha mẹ'. Hiện tại khi tôi thêm chú thích, tôi triển khai phương thức didAddAnnotationViews để tạo hoạt ảnh cho các chú thích đó để chúng xuất hiện từ tọa độ của cha mẹ chúng. Có cách nào để thực hiện việc này trong khi xóa chú thích không? Khi tôi xóa chú thích khỏi bản đồ, tôi muốn chú thích đó hoạt ảnh với tọa độ gốc của nó và theo như tôi biết, không có tương đương với didAddAnnotationViews khi chú thích bị xóa.Xóa động các chú thích
Trả lời
Chú thích animate trước bạn xóa nó khỏi bản đồ và thực hiện xóa sau khi hoạt ảnh được hoàn tất. Mã này có thể trông giống như:
- (void) removeMyAnnotation:(MyAnnotation*)annotation{
[UIView animateWithDuration:1.0f
animations:^(void){
annotation.coordinate = annotation.parentAnnotation.coordinate;
}
completion:^(BOOL finished)completion{
[mapView removeAnnotation:annotation];
}
}
Bạn nên KHÔNG gọi Hoãn của removeAnnotation như trong câu trả lời @ Vladimir vì tình trạng MKMapView có thể thay đổi trong hình ảnh động.
Khi thời gian removeAnnotation được gọi từ khối hoàn thành hoạt ảnh, một chú thích khác có thể được thêm/xóa khỏi MapView - vì vậy, trong một số trường hợp, bạn có thể kết thúc xóa nhóm chú thích sai.
tôi đã viết thể loại này cho MKMapView bạn có thể sử dụng để loại bỏ chú thích hoạt hình theo cách an toàn:
@interface MKMapView (RemoveAnnotationWithAnimation)
- (void)removeAnnotation:(id <MKAnnotation>)annotation animated:(BOOL)animated;
- (void)removeAnnotations:(NSArray *)annotations animated:(BOOL)animated;
@end
Và file .m:
@implementation MKMapView (RemoveAnnotationWithAnimation)
- (void)removeAnnotation:(id <MKAnnotation>)annotation animated:(BOOL)animated
{
[self removeAnnotations:@[annotation] animated:animated];
}
- (void)removeAnnotations:(NSArray *)annotations animated:(BOOL)animated
{
if (animated) {
NSSet * visibleAnnotations = [self annotationsInMapRect:self.visibleMapRect];
NSMutableArray * annotationsToRemoveWithAnimation = [NSMutableArray array];
for (id<MKAnnotation> annotation in annotations) {
if ([visibleAnnotations containsObject:annotation]) {
[annotationsToRemoveWithAnimation addObject:annotation];
}
}
NSMutableArray * snapshotViews = [NSMutableArray array];
for (id<MKAnnotation> annotation in annotationsToRemoveWithAnimation) {
UIView * annotationView = [self viewForAnnotation:annotation];
if (annotationView) {
UIView * snapshotView = [annotationView snapshotViewAfterScreenUpdates:NO];
snapshotView.frame = annotationView.frame;
[snapshotViews addObject:snapshotView];
[[annotationView superview] insertSubview:snapshotView aboveSubview:annotationView];
}
}
[UIView animateWithDuration:0.5
animations:^{
for (UIView * snapshotView in snapshotViews) {
// Change the way views are animated if you want
CGRect frame = snapshotView.frame;
frame.origin.y = -frame.size.height;
snapshotView.frame = frame;
}
}
completion:^(BOOL finished) {
for (UIView * snapshotView in snapshotViews) {
[snapshotView removeFromSuperview];
}
}];
}
[self removeAnnotations:annotations];
}
@end
Tôi đã triển khai giải pháp này để làm mờ chú thích của mình. Điều này không hoạt động khi panning bản đồ trong khi các khung nhìn snapshot đang mờ dần, vì chúng sẽ được đặt trong khi bản đồ di chuyển. Trông khá kỳ lạ. – duncanc4
Sau khi đọc qua nhận xét của bạn và suy nghĩ về giải pháp của @ Vladimir, tôi không thấy cách thêm hoặc loại bỏ các chú thích khác nhau trong các hiệu ứng hoạt hình khả năng loại bỏ chú thích cụ thể khi khối hoàn thành thực hiện. Khối này nắm bắt con trỏ, vì vậy nó có chú thích chính xác cần xóa. Vấn đề duy nhất tôi có thể thấy là nếu một số mã khác loại bỏ chú thích chính xác đang hoạt ảnh. Tôi không chắc chắn những gì 'MKMapView' hiện nếu nó không có chú thích bạn đang cố gắng để loại bỏ. – duncanc4
@ duncanc4 Vấn đề là MKMapView sử dụng lại các trường hợp xem chú thích, như UITableView làm với các ô của nó. Vì vậy, nếu bạn lưu con trỏ vào chú thích bị xóa và di chuyển bản đồ đến nhóm chú thích khác, bạn có thể kết thúc xóa chú thích sai khi khối thực thi. – NAlexN
- 1. Xóa các chú thích thừa trong ggplot2
- 2. Xóa các dòng trong chú thích fill.contour
- 3. Xcode thay đổi/xóa mẫu chú thích
- 4. Xóa khỏi bảng có chú thích @OneToOne
- 5. Ẩn các chú thích bản đồ mà không xóa chúng
- 6. Các chú thích Java này hoạt động như thế nào?
- 7. Tự động tạo các chú thích tài liệu trong Vim
- 8. Chú thích từ javax.validation.constraints không hoạt động
- 9. jqGrid - thiết lập chú thích động
- 10. Sử dụng tx: chú thích theo hướng chú thích ngăn không cho tự động đậu
- 11. Chú thích MKMapview chú thích thay đổi hình ảnh pin động sau khi phóng to
- 12. Làm cách nào để xóa chú thích khỏi GoogleChartChart?
- 13. MKMapView di chuyển chú thích Tự động - animate chúng?
- 14. Chuyển động chú thích mượt mà trên OS 4
- 15. Đi qua thuộc tính chú thích để meta-chú thích
- 16. Cách tạo chú thích là một nhóm chú thích?
- 17. chú thích @Override
- 18. Chú thích nhiều chú thích hiển thị trong MKMapView
- 19. Chú thích ở trên các thanh:
- 20. Các quy ước chú thích Java
- 21. Chú thích cho các bảng trong LaTeX
- 22. Chú thích @SuppressLint ("NewApi")
- 23. Java chú thích
- 24. Chú thích junit
- 25. chú thích java: thư viện ghi đè chú thích bằng các tệp xml
- 26. Loại chú thích ElementType.LOCAL_VARIABLE
- 27. chú thích & regex
- 28. @IdClass JPA Chú thích
- 29. Xóa các chú thích XML bằng cách sử dụng Visual Studio 2010 Web Config Transformation
- 30. Chú thích công cụ jQuery ưa thích?
Cảm ơn - một điều khác, là có một cách truy cập MKAnnotationView tương ứng của chú thích để tôi có thể di chuyển nó theo cách đó? Bởi vì lớp chú thích của tôi tính toán tọa độ động của nó nên nó không thể được thiết lập (trừ khi tôi thêm vào một tải các chức năng để thiết lập các tọa độ tùy chỉnh, mà tôi muốn tránh). – benwad
@benwad, bạn có thể sử dụng phương thức viewForAnnotation trong MKMapView, mặc dù nó không được đảm bảo luôn trả về dạng xem thực (nó có thể trả về nil nếu chú thích không hiển thị ví dụ) – Vladimir
ParentAnnotation là gì? – malhal