2017-04-13 52 views

回答

1

要選擇一個註釋,並顯示it's標題不點擊它,這應該是足夠了:

mapView.selectAnnotation(annotation, animated: true) 

如果你想顯示that's不可能所有的標題做的,只有一個是可能的。

從您的評論,參見下面的更新:
繼承MKMapViewDelegate並在viewDidLoad設置map.delegate = self

在地圖上添加點按手勢以檢測annotations以外的點擊。

let tap = UITapGestureRecognizer(target: self, action: #selector(tappedOnMap)) 
map.addGestureRecognizer(tap) 

現在我們有兩個功能一起工作:

func tappedOnMap(_ gesture: UITapGestureRecognizer){ 
    mapTapped = true 
} 

func mapView(_ mapView: MKMapView, didDeselect view: MKAnnotationView) { 
    if mapTapped { 
     map.selectAnnotation(map.annotations[1], animated: true) 
    } 
} 

當你在地圖上輕點tappedOnMap函數將被調用。當您點擊註釋之外時,系統將自動調用didDeselect這就是爲什麼我已經聲明mapTapped Bool變量用於跟蹤用戶是否已在地圖上或註釋中輕觸。在didDeselect中,您可以設置應在if語句中顯示哪個默認標題。

因此,基本上,您可以檢測註釋外部的水龍頭和didDeselect函數中的水龍頭,檢查它是否在註記上或地圖上輕按。如果它在地圖上,則顯示默認或任何您喜歡的註釋標題,否則用戶點擊註釋。您也可以隨時返回默認的註釋,這麼做消除在didDeselect功能的if語句,只是設置map.selectAnnotation...

Here是我爲您創建與嘗試的示例項目。

+0

如果你想要做所有的註釋,你可以循環訪問'mapView.annotations'嗎? – MacStation

+1

@MacStation,這也不起作用。蘋果已被封鎖,因此一次只能有一個註釋處於活動狀態。 –

+0

+1好點。我同時也找出了這種方法,但我仍然可以選擇/取消選擇註釋。我希望確保標題始終可見,而不管用戶與地圖的交互情況如何。我仍然沒有找到最後一部分的解決方案。 – tiguero

1

這是我answer我原來的問題:

  • 默認顯示標註:上,你可以調用標註的選擇通過mapView.selectAnnotation(annotation, animated: false)
  • 做出標註不是可點擊的MapView:通過創建自定義MGLCallOutViewdisabling交互或其內部可定位組件(通過將userinteractionenabled設置爲false)。您將通過此代理方法傳遞您的新標註實例:func mapView(_ mapView: MGLMapView, calloutViewFor annotation: MGLAnnotation) -> UIView?符合MGLMapViewDelegate

實際上,正如我在更新的問題中提到的,我真正想要的是防止每當我們與地圖交互時隱藏標註。

首先;一個人應該知道這是而不是的常見行爲:通過點擊標註以外的地方,它會消失,但在地圖上平移或縮放不會消除標註。

如果你還是希望有這種特定的行爲有兩種可能的方式來做到這一點:

  • 使自定義MGLAnnotationView與用戶交互上禁用。註釋視圖將處理註釋標題的顯示,但不會被選中。確保在這種情況下您可以觸發標註的顯示。

  • 定製MGLCallOutView並覆蓋dismissCallout方法。在此方法中,您可以確保您不會忽視視圖。

這裏有一些資源的例子是幫我找到這些解決方案:

請注意,第二解決方案可能更hacky,我會鼓勵去尋找第一個解決方案。