2012-03-29 38 views
4

當有人觸摸MKPolylineView時,是否有任何方式顯示標註? 我試着添加一個UITapGestureRecognizer,並在選擇器中顯示一些座標中的標註。但沒有工作。任何建議,使這個?來自MKPolylineView的標註?

以下是我在嘗試的方法

- (MKOverlayView *)mapView:(MKMapView *)mapa viewForOverlay:(id <MKOverlay>)overlay 
     self.polylineView = [[MKPolylineView alloc] initWithPolyline: self.polyline]; 
     self.polylineView.strokeColor = [UIColor blackColor]; 
     self.polylineView.lineWidth = 5.0; 
     self.polylineView.alpha = 0.7; 
     UITapGestureRecognizer *touchOnView = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(addBubble:)]; 
     [touchOnView setNumberOfTapsRequired:1]; 
     [touchOnView setNumberOfTouchesRequired:1]; 
     [self.polylineView addGestureRecognizer:touchOnView]; 

回答

8

非常有趣的問題 - 我從來沒有想過把手勢識別上的地圖疊加。通過一些實驗,我已經驗證了可以檢測到MKPolylineView上的水龍頭。就像你發現的那樣,輕拍手勢不適用於地圖疊加。因此,我將輕拍手勢放在MKMapView而不是MKPolylineView上。然後處理水龍頭:

- (void)handleTapGesture:(UIGestureRecognizer*)gestureRecognizer 
{ 
    if (measureLine != nil) 
    { 
     UIView* hitView = [self.polylineView hitTest:[gestureRecognizer locationInView:self.polylineView] withEvent:nil]; 
    } 
} 

hitView將是零,如果水龍頭是MKPolylineView之外,或者這將是self.polylineView如果水龍頭在裏面。

但是,這可能不像你想的那樣表現得很好。對於水平線和垂直線,它可以很好地工作,因爲底層視圖的大小與線的大小大致相同。但對於45度線,底層視圖必須比線更大,因爲它是一個軸對齊邊界框(AABB)。如果您考慮一條45度的線,只用水平線和垂直線包圍它,您將最終得到一個大面積 - 比您希望檢測水龍頭的面積大得多。

例如

-------- 
| /| 
| /| 
|/ | 
|/ | 
|/  | 
-------- 

但是使用輕擊手勢或點擊測試總是會導致識別這些AABB內部的水龍頭。所以無論您嘗試附加您的手勢 - 例如到您嘗試的MKPolylineView,或到MKMapView,您將得到虛假結果。對於更長的線條,問題會變得更糟 - 如果您想象一條線從地圖視圖的右上角到左下角,則需要將它包圍的AABB將覆蓋地圖視圖的整個區域,這意味着點擊左上角或右下角將被解釋爲擊中MKPolylineView

爲了解決這個問題,我建議以下方法:

  • 轉換屏幕:

    • 在地圖上查看
    • 在你的方法來處理自來水使用自來水手勢識別點擊位置到地圖座標
    • 循環遍歷每條多段線(除非您只有1個)
    • 對於多段線中的每個點,請將連線指向下一個點的cts,並計算您的地圖座標遠離此線的距離。使用三角函數來計算這個。
      • 如果距離非常接近這一細分市場,然後停止檢查段的休息和處理你想要的任何標註等顯示
      • 如果距離不近,然後移動到下一個點和線段,它連接到隔一個點

這種方法保證無論工作的折線的長度,還是什麼角度他們是在的。沒有AABB的擔憂。缺點是所有這些距離計算可能在計算上花費很大 - 所以如果你的多段線由很多點構成,或者如果你有很多多段線,那麼你可能無法完成所有這些計算而不會阻止用戶界面的響應,這意味着您需要將其移動到後臺線程中。如果你只有一些折線,並且/或者它們由幾個點組成,那麼你會沒事的。