2010-03-18 58 views
9

在我的iphone應用程序中,我使用MapKit和MKMapView以及自定義的MKAnnotationView。在地圖上重疊註釋(MKAnnotationView)的問題

問題是當地圖上的註釋重疊時(在我的應用中,註釋是照片並且這些照片可能重疊),並且當您點擊前面出現的註釋時,它是接收事件的另一個註釋(背面)似乎是隨機的)。

我沒有找到任何方法將事件發送到前面的註釋。 我不敢相信這個bug /問題沒有任何解決方案!

Z orderingOrder of overlapping annotations關於stackoverflow的問題並沒有多大幫助。

歡迎任何想法(甚至骯髒的解決方案)!

下面是一些我的代碼(沒有什麼花哨,很常見的):

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 

主要類 ... //註解加入,其中一些重疊與他人。

- (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; 
} 

回答

2

最後,我找到了最好的方式,避免失去地圖funcionalities是:

  • 讓上CustomAnnotationView(touchesEnded)觸摸監聽器(每個註釋)

  • 當接收觸摸事件,將事件轉移到主類

  • 主類在註釋上循環並保持具有良好位置的註釋(在註釋框中觸摸事件),並且在前面

它工作得很好。與

annView.enabled = NO 

+0

好主意。我做了透明UIView,發現它缺乏。 – 2010-04-24 18:01:16

+1

我很想知道你是如何處理第三點的。你如何找到某個CGPoint或CGRect的最前面的註釋? – samvermette 2010-10-21 17:18:52

0

查看此解決方案question。基本上你會創建一個透明的UIView,它將攔截所有的觸摸。我還沒有嘗試過,但如果你不得不重新實現MKMapView中的所有縮放功能,這可能比它的價值更麻煩。

如果您有兩個(或更多)MKAnnotations共址,您可以重複點擊以在兩者之間切換。這應該沒有任何改變你的應用程序的工作。

0

在亞歷山大的回答跟進,我停用了所有的自定義MKAnnotationViews對象,使他們不至的MKMapView默認選擇的行爲作出反應,並在我的自定義實現MKAnnotationView如下:

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

這個解決方案在iOS 4上效果很好。看起來像禁用MKAnnotationView不會禁用它的userInteractionEnabled,而在iOS 3上它會。仍然在尋找適用於iOS 3的解決方案...

編輯:實際上,這似乎是iOS 4.1中的一個錯誤。在iOS 4.2中,禁用引腳也會禁用觸摸事件。因此,此方法僅適用於4.1和可能的4.0。

0

我已將UITapGestureRecognizer添加到前面的視圖中,併爲我解決了問題。

在你的情況下,添加一個手勢識別器到CustomAnnotationView應該可以解決這個問題。

+1

不要這樣做。手勢識別器阻止觸摸事件傳遞到地圖,不久地圖停止進行代表回調,如regionDidChangeAnimated:等等,這會導致更多問題。 – Anurag 2012-05-14 18:06:47