2010-03-18 27 views
9

Trong ứng dụng iphone của tôi, tôi đang sử dụng MapKit với MKMapView và MKAnnotationView tùy chỉnh.Vấn đề với chú thích chồng chéo (MKAnnotationView) trên bản đồ

Vấn đề là khi chú thích chồng chéo trên bản đồ (trong ứng dụng của tôi, chú thích là ảnh và ảnh đó có thể trùng lặp) và khi bạn nhấn vào chú thích xuất hiện ở phía trước, đó là chú thích khác (mặt sau) nhận sự kiện (dường như là ngẫu nhiên).

Tôi không tìm thấy bất kỳ cách nào để gửi sự kiện tới chú thích trước. Tôi không thể tin rằng lỗi/vấn đề này không có giải pháp nào!

Z orderingOrder of overlapping annotations câu hỏi về lưu lượng truy cập không giúp ích nhiều cho tôi.

Vui lòng bất kỳ ý tưởng nào được hoan nghênh (ngay cả các giải pháp bẩn)!

Dưới đây là một số mã của tôi (không có gì lạ mắt, rất phổ biến):

CustomAnnotation.h

@interface CustomAnnotation : NSObject <MKAnnotation> { 
    @private 
    CustomAnnotationView* view; 
} 

    @property (nonatomic, retain) CustomAnnotationView* view; 

@end 

CustomAnnotation.m

@implementation CustomAnnotation 

@synthetize view; 

CustomAnnotationView.h

@interface CustomAnnotationView : MKAnnotationView { 
} 

@end 

CustomAnnotationView.m

@implementation CustomAnnotationView 

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{ 
// Do something related to the annotation tapped 
} 

@end 

lớp Main ... // Chú thích được thêm vào và một số trong số họ chồng chéo với những người khác.

- (void)addAnnotation:(CustomAnnotation*)annotation { 
    [map addAnnotation:annotation]; 
} 

... 

- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation { 

    NSString* identifier = getIdentifierFromAnnotation(annotation); 
    CustomAnnotationView* view; 
    if(!(view = (CustomAnnotationView*)[map dequeueReusableAnnotationViewWithIdentifier:identifier])) { 
     view = [[CustomAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier: identifier]; 
     [(CustomAnnotation*)annotation setView:view]; 
     [view release]; 
    } 
    return view; 
} 

Trả lời

2

Cuối cùng, cách tốt nhất mà tôi tìm thấy và tránh mất funcionalities bản đồ là:

  • để cho người nghe cảm ứng trên CustomAnnotationView (touchesEnded) (trên mỗi chú thích)

  • khi nhận sự kiện liên lạc , chuyển sự kiện sang lớp chính

  • vòng lặp chính của lớp học trên chú thích và giữ chú thích có vị trí tốt (chạm vào sự kiện trong khung chú thích) và ở phía trước

Nó hoạt động khá tốt.

+0

Ý tưởng tuyệt vời. Tôi đã làm UIView minh bạch và thấy nó thiếu. –

+1

Tôi rất muốn biết bạn đang đối phó với điểm đạn thứ ba như thế nào. Làm thế nào để bạn tìm thấy chú thích phía trước tại một CGPoint hoặc CGRect nhất định? – samvermette

0

Xem giải pháp cho số question này. Về cơ bản bạn sẽ tạo ra một UIView minh bạch mà sẽ đánh chặn tất cả các chạm. Tôi đã không thử nó, nhưng điều này có thể rắc rối hơn nó có giá trị nếu bạn phải reimplement tất cả các chức năng pinch-to-zoom trong MKMapView.

Nếu bạn có hai (hoặc nhiều hơn) MKAnnotations cùng nằm, bạn có thể nhấn liên tục để chuyển đổi giữa hai. Điều đó sẽ hoạt động mà không có bất kỳ thay đổi nào đối với ứng dụng của bạn.

0

Theo dõi về câu trả lời Alexandre, tôi bị vô hiệu hóa tất cả MKAnnotationViews tùy chỉnh của tôi đối tượng với

annView.enabled = NO 

vì vậy họ không đáp ứng với các hành vi lựa chọn MKMapView mặc định, và thực hiện tùy chỉnh của tôi MKAnnotationView sau:

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event { 
self.enabled = YES; 
[(MKMapView*)self.superview selectAnnotation:self.annotation animated:NO]; 
} 

Giải pháp này hoạt động tốt trên iOS 4. Có vẻ như vô hiệu hóa một MKAnnotationView không vô hiệu hóa userInteractionEnabled của nó, trong khi trên iOS 3 nó làm. Vẫn đang tìm giải pháp cho iOS 3 ...

EDIT: thực sự, đây có vẻ là lỗi trong iOS 4.1. Trong iOS 4.2, việc tắt ghim cũng sẽ vô hiệu hóa các sự kiện chạm. Do đó phương thức này chỉ hoạt động với 4.1 và có thể là 4.0.

0

Tôi đã thêm UITapGestureRecognizer vào chế độ xem ở mặt trước và giải quyết được sự cố cho tôi.

Trong trường hợp của bạn, thêm trình nhận dạng cử chỉ vào CustomAnnotationView sẽ giải quyết vấn đề.

+1

Đừng làm điều này. Khối nhận dạng cử chỉ chạm vào phân phối sự kiện trên bản đồ và ngay sau đó bản đồ ngừng thực hiện cuộc gọi lại đại biểu như regionDidChangeAnimated: v.v. gây ra nhiều sự cố hơn. – Anurag

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