2009-11-05 12 views
13

Tôi nhận được khá thất vọng với những hạn chế của MKMapKit. Vấn đề hiện tại của tôi phải liên quan đến thứ tự z của các khung nhìn chú thích, đặc biệt khi nó liên quan đến các lần chạm. Nếu bạn chấp nhận thứ tự z mặc định mà bộ bản đồ cung cấp cho bạn:Z-thứ tự của MKAnnotationViews

  1. Thứ tự xuất hiện ngẫu nhiên. Thứ tự z không liên quan đến thứ tự các chú thích đã được thêm vào.
  2. Nếu một chú thích kết thúc trên đầu trang của một chú thích khác, chạm vào chú thích trên cùng thường sẽ hiển thị chú thích cho chú thích dưới cùng. Nó có vẻ như phát hiện hit thậm chí không tôn trọng thứ tự vẽ. Có chuyện gì thế?

tôi đã cố gắng giải quyết # 1 sử dụng một cái gì đó tương tự như đoạn mã sau được tìm thấy trên các trang web (được thiết kế để cung cấp cho một số quyền kiểm soát z-trật tự)

 
- (void)mapView:(MKMapView *)mapView didAddAnnotationViews:(NSArray *)views { 
    for (MKAnnotationView * annView in views) { 
     TopBottomAnnotation * ann = (TopBottomAnnotation *) [annView annotation]; 
     if ([ann top]) { 
     [[annView superview] bringSubviewToFront:annView]; 
     } else { 
     [[annView superview] sendSubviewToBack:annView]; 
     } 
    } 

} 

Chạy qua các quan điểm chú thích thông qua mapView: didAddAnnotationViews: và điều chỉnh thứ tự z của chúng dường như sửa # 1. Vấn đề ở đây là các chế độ xem chú thích không còn luôn ở trên cùng với chế độ xem chú thích. MapKit dường như rất bối rối về các lớp (chú thích nên được vẽ trong một lớp phía trên tất cả các khung nhìn chú thích). Tôi thậm chí có thể tìm ra cách nó bị lẫn lộn vì tất cả các MKAnnotationViews bạn nhận được có cùng một superview (một lớp MKOverlayView riêng). Bạn sẽ nghĩ rằng bất kỳ thiết kế hợp lý nào sẽ thu hút chú thích về chế độ xem lớp phủ này.

Có ai đã giải quyết # 1 hoặC# 2 thành công không?

+0

Bạn đã nhận được lớp TopBottomAnnotation ở đâu? –

+0

Các TopBottomAnnotation là tên của lớp chú thích của bạn xem –

+1

... gần 6 năm sau đó và tôi có cùng một vấn đề. Làm thế nào điều này đã không được cố định? – Tys

Trả lời

8

Nếu bạn có một annotationView tùy chỉnh (mà âm thanh như bạn đã có), bạn có thể thử thêm này:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    [self.superview bringSubviewToFront:self]; 
    [super touchesBegan:touches withEvent:event]; 
} 

Một tác dụng phụ là mỗi lần đánh dấu được chạm vào nó cũng bật vào phía trước của thứ tự z, thực sự là hợp lý vì đó là những gì người dùng đang tập trung vào.

+0

Ramin, Cảm ơn bạn đã trả lời. Tôi không nghĩ rằng nó giải quyết được vấn đề của tôi. Đây là chú thích không được hiển thị ở đầu chế độ xem chú thích. Tôi cũng cần phải kiểm soát thứ tự z của chế độ xem chú thích này mà không cần người dùng phải chạm vào chúng. Một số chế độ xem có mức độ ưu tiên cao hơn và sẽ được hiển thị ở đầu các chế độ xem ưu tiên thấp hơn khác. – btschumy

+0

Tôi không biết nếu đó là vấn đề tương tự nhưng tôi đã có một loạt các điểm đánh dấu được đặt gần nhau.Nhấn vào từng chốt sẽ làm cho chú thích hiển thị bên dưới các chân khác, vì vậy có vẻ như mỗi chú thích sẽ duy trì lớp chú thích của riêng nó. Nhưng bạn nói đúng, chú dẫn phải ở trên lớp trên cùng của riêng họ. Có thể muốn gửi báo cáo lỗi. – Ramin

+0

Ramin, Tôi vừa thử giải pháp của bạn và thực sự giải quyết được vấn đề chú thích không được hiển thị ở đầu tất cả các chú thích. Cảm ơn. Dường như vẫn có vấn đề trong đó chú thích nhận được liên lạc khi chúng chồng lên nhau. Nhưng đó là ít quan trọng hơn sửa chữa khác. – btschumy

7

Ramin, điều đó hoàn hảo cho những gì tôi đang cố gắng làm. Mặc dù vậy, tôi không có chế độ xem chú thích tùy chỉnh. Tôi đã giải quyết vấn đề này bằng cách sử dụng một danh mục và nó hoạt động hoàn hảo!

Đây là tiêu đề:

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


@interface MKPinAnnotationView (ZIndexFix) 
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event; 
@end 

Và thực hiện:

#import "AEBMapViewCategory.h" 
@implementation MKPinAnnotationView (ZIndexFix) 
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    [self.superview bringSubviewToFront:self]; 
    [super touchesBegan:touches withEvent:event]; 
} 
@end 
+0

Tuyệt vời ... Đó là những gì tôi gọi là một đoạn mã tốt. – Biranchi

+0

điều này nên phù hợp với nhau như thế nào với mapViewForAnnotations hoặc, thường là phần còn lại của ứng dụng bản đồ? xin lỗi nó không rõ ràng với tôi. – si28719e

+0

wow. do đó, loại này dường như 'chỉ hoạt động'. điều đó thật tuyệt vời, nhưng tôi vẫn muốn biết 'tại sao'. và tôi không biết. – si28719e

6

Hãy thử một giải pháp, thiết lập xem chú thích lớp của zPosition (annotationView.layer.zPosition) tại:

(void) mapView: (MKMapView *) mapView didAddAnnotationViews: (NSArray *) lượt xem;

+0

Cách đúng để thực hiện – rmvz3