2017-12-31 47 views
0

ios11でmapviewに追加された新機能を使用しようとしています。注釈がクラスタ化されているかどうかを確認する方法(MKMarkerAnnotationViewとCluster)

私はすべてのMKAnnotationViewをサークルコリジョンでクラスタリングしていますが、アノテーションがクラスタ化されるとリアルタイムでチェックする必要があります。

どうすればいいのかわかりません。

EDIT(2018年4月1日):

詳しい情報:私は、注釈を選択した場合、私はdidSelectメソッドが呼び出されたときにカスタムCallOutViewを追加し、didDeselectメソッドが呼び出されるコールアウトを削除します。

アノテーションが選択されていても「通常」の状態でズームインすると、アノテーションが選択されてクラスタ化される場合が問題です。

didDeselectメソッドのようにクラスタ化されると、選択した注釈のCallOutを削除します。私の問題説明するためにスクリーンショットの下

1 - Annotation Selected

2 - Annotation Clustered

3 - Annotation Zoom In after cluster

を、私はそれを理解するだけの問題だと思います。

本当にありがとうございます。 ありがとうございました

答えて

0

、AppleはまたMKMapViewDelegateで新しいコールバック紹介:

func mapView(_ mapView: MKMapView, clusterAnnotationForMemberAnnotations memberAnnotations: [MKAnnotation]) -> MKClusterAnnotation

を注釈は、クラスタ化になる前に、この関数は次のようになりますmemberAnnotationsの場合はMKClusterAnnotationを請求するように呼び出しました。したがって、memberAnnotationsという2番目のパラメータは、クラスタ化される注釈を示します。

EDIT(2018年4月1日):

クラスタ注釈のための2つの重要なステップがあります。

まず、クラスタ化になるの注釈の前に、memberAnnotationsためMKClusterAnnotationを要求するmapView:clusterAnnotationForMemberAnnotations:関数を呼び出しMapKit。

第2に、MapKitはMKMapViewにMKClusterAnnotationを追加し、mapView:viewForAnnotation:関数を呼び出してMKAnnotationViewを生成します。

ですから、このように、2つの段階のいずれかで注釈を選択解除することができます

var selectedAnnotation: MKAnnotation? //the selected annotation

func mapView(_ mapView: MKMapView, clusterAnnotationForMemberAnnotations memberAnnotations: [MKAnnotation]) -> MKClusterAnnotation { 
    for annotation in memberAnnotations { 
     if annotation === selectedAnnotation { 
      mapView.deselectAnnotation(selectedAnnotation, animated: false)//Or remove the callout 
     } 
    } 

    //... 
} 

または:

func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? { 
    if let clusterAnnotation = annotation as? MKClusterAnnotation { 
     for annotation in clusterAnnotation.memberAnnotations { 
      if annotation === selectedAnnotation { 
       mapView.deselectAnnotation(selectedAnnotation, animated: false)//Or remove the callout 
      } 
     } 
    } 

    //... 
} 
+0

ありがとう、私は知らなかった。私はちょうど選択された注釈だけを取得する方法に立ち往生しています。選択した注釈をクラスター化したとき(この1つだけ) –

+0

@SeikiKisekashの選択を解除したい場合は、問題の答えを更新します。 – devliubo

+0

お返事ありがとうございました!私が使用: にfuncのMapView(_のMapView:MKMapView、clusterAnnotationForMemberAnnotationsのmemberAnnotations:[MKAnnotation]) - > MKClusterAnnotation は今、私は新しい問題に直面し、私のアプリで作業を続けることができません。 注釈をズームイン/ズームアウトすると、アプリがクラッシュします。 私はこの問題を解決しようとしました:https://forums.developer.apple.com/thread/89427 そして、私の問題は次のものと同じです:https://openradar.appspot.com/36131654 確かに、問題は、選択解除に関連していないが、私はまだ立ち往生しています。 –

0

新しいクラスタが形成されると、mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView?が呼び出され、そのクラスタの新しいビューを要求します。

あなたはこのようにあなたをチェックしますかすることができます:iOSの11で

func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? { 
    //... 
    if annotation is MKClusterAnnotation { 
     //This is your new cluster. 
    } 
    //Alternatively if you need to use the values within that annotation you can do 
    if let cluster = annotation as? MKClusterAnnotation { 

    } 
    //... 
} 
+0

が、それは本当に参考になっている、あなたのexplainationいただきありがとうございます私の問題の解決。私はまだ立ち往生しています、私はちょうど私の問題についてより多くの情報を追加しました。私は解決するためにこれを続けます。 –

関連する問題