web-dev-qa-db-ja.com

SwiftおよびMapKit内でMKPinAnnotationView()の使用に固執

一部の作業データポイントのタイトル要素とサブタイトル要素の注釈を設定するための作業ループがあります。同じループ構造内でやりたいのは、ピンの色をデフォルトではなく紫に設定することです。私が理解できないのは、それに応じてピンを設定するためにMapViewを利用するために何をする必要があるかです。

私の作業ループと何かの試み...

....
for var index = 0; index < MySupplierData.count; ++index {

  // Establish an Annotation
  myAnnotation = MKPointAnnotation();
  ... establish the coordinate,title, subtitle properties - this all works
  self.theMapView.addAnnotation(myAnnotation)  // this works great.

  // In thinking about PinView and how to set it up I have this...
  myPinView = MKPinAnnotationView();      
  myPinView.animatesDrop = true;
  myPinView.pinColor = MKPinAnnotationColor.Purple;  

  // Now how do I get this view to be used for this particular Annotation in theMapView that I am iterating through??? Somehow I need to marry them or know how to replace these attributes directly without the above code for each data point added to the view
  // It would be Nice to have some kind of addPinView.  

}
14
Kokanee

viewForAnnotationデリゲートメソッドを実装し、そこからMKAnnotationView(またはサブクラス)を返す必要があります。
これはObjective-Cと同じです。基盤となるSDKは同じように機能します。

アノテーションを追加するMKPinAnnotationViewループからforの作成を削除し、代わりにデリゲートメソッドを実装します。

SwiftのviewForAnnotationデリゲートメソッドの実装例を次に示します。

func mapView(mapView: MKMapView!, 
    viewForAnnotation annotation: MKAnnotation!) -> MKAnnotationView! {

    if annotation is MKUserLocation {
        //return nil so map view draws "blue dot" for standard user location
        return nil
    }

    let reuseId = "pin"

    var pinView = mapView.dequeueReusableAnnotationViewWithIdentifier(reuseId) as? MKPinAnnotationView
    if pinView == nil {
        pinView = MKPinAnnotationView(annotation: annotation, reuseIdentifier: reuseId)
        pinView!.canShowCallout = true
        pinView!.animatesDrop = true
        pinView!.pinColor = .Purple
    }
    else {
        pinView!.annotation = annotation
    }

    return pinView
}
37
user467105