2016-07-14 14 views
1

注釈付きの単純なマップを作成しようとしましたが、実行しようとするとdetailCalloutAccessoryViewのイメージは同じですが、2つの異なるイメージを入れました。これが起こる?それとも誰かがこれを行う良い方法がありますか?同じCalloutAccessoryViewイメージを繰り返している迅速なマップキットの注釈

var tripspot:[tripSpot] = [ 
    tripSpot(title: "1", coordinate: CLLocationCoordinate2DMake(24.149062, 120.684891), location: "台中市北區一中街", type: "rare",cllocation:CLLocation(latitude: 24.181143, longitude: 120.593158),image : "025"), 
    tripSpot(title: "2", coordinate: CLLocationCoordinate2DMake(24.180407, 120.645086), location:"台中逢甲", type: "rare",cllocation:CLLocation(latitude: 24.180407, longitude: 120.645086),image : "007")] 
    // Build LocationManager 
let locationManager = CLLocationManager() 


override func viewDidLoad() { 
    super.viewDidLoad() 


    // set data 
    setupData() 

} 

func setupData(){ 
    for aSpot in tripspot { 
      //set annotation 
      let coordinate = aSpot.coordinate 
      let title = aSpot.title 
      let type = aSpot.type 

      //set annotation 
      let tripSpotAnnotation = MKPointAnnotation() 
      tripSpotAnnotation.coordinate = coordinate 
      tripSpotAnnotation.title = title 
      tripSpotAnnotation.subtitle = type 
      mapView.addAnnotations([tripSpotAnnotation]) 



     } 
    } 
func mapView(mapView: MKMapView, viewForAnnotation annotation: MKAnnotation) -> MKAnnotationView? 
{ 
    if annotation.isKindOfClass(MKUserLocation) 
    { 

     return nil 
    } 

    var view = mapView.dequeueReusableAnnotationViewWithIdentifier("annotationIdentifier")as? MKPinAnnotationView 

    if view == nil 
    { 
     view = MKPinAnnotationView(annotation: annotation, reuseIdentifier: "annotationIdentifier") 
     view?.canShowCallout = true 
     view?.sizeToFit() 
    } 
    else{ 
     view!.annotation = annotation 
    } 
    for aSpot in tripspot{ 

     // set pinview 
     let detailCalloutAccessoryView = UIImageView(frame: CGRectMake(0, 0, 53, 53)) 
     detailCalloutAccessoryView.image = UIImage(named: aSpot.image!) 
     view?.detailCalloutAccessoryView = detailCalloutAccessoryView 

    view?.pinTintColor = pinColor(annotation.subtitle!!) 
    } 
    return view 
    } 

ありがとうございます。

+0

Cocoaの命名規則に従い、 'class'と' struct'型に大文字で始まる名前(例えば 'TripSpot')を付けることをお勧めします。タイプを参照しているときや、そのタイプのインスタンスを参照しているときに、より明確になります。 – Rob

答えて

1

tripSpotの配列全体を反復処理しないでください。viewForAnnotationです。このメソッドは特定の注釈用ですが、これが記述されている方法では、すべての注釈の詳細アクセサリをaSpotの各画像に繰り返し設定(およびリセット)して、tripspotに設定し、すべての注釈に効果的に同じ詳細アクセサリを与えます最後にtripspot(非効率的に行う)。

代わりに、アノテーションにMKPointAnnotationのサブクラスを作成し、プロパティを追加して、特定のアノテーションに使用するイメージを知るようにします。 tripspotが参照型の配列の場合は、関連するtripspotエントリを参照するプロパティを追加するだけで、表示するイメージを特定できます。そして、viewForAnnotationは、tripspot配列を反復するのではなく、カスタムアノテーションサブクラスからそのプロパティを取得する必要があります。また、基礎となるtripspotのエントリへの参照を含めることによって、 "did select detail accessory"ルーチンを使用して、関連付けられているトリップポイントを知り、適切な処置をとることができるようになりました。

私はいくつの潜在的な注釈があるかはわかりませんが、画像の名前ではなく、画像の名前をtripspot配列に保存する方が賢明かもしれません。イメージは比較的大きく、注釈がたくさんある場合はメモリの問題にぶつかる危険性があります。一般的に、配列に実際の画像を取り込むのではなく、必要に応じてUIImageオブジェクトをインスタンス化する方が賢明です。

+0

こんにちは、@ロブ、私はあなたの説明を理解していない、私は各注釈にすべての画像を追加する必要があるという意味ですか?申し訳ありませんが、英語は私の母国語ではありません。 –

+0

@JohnnyHsieh - おそらく簡単ですが、 'TripSpot'クラスが' MKAnnotation'に準拠していると考えて、 'MKPointAnnotation'をバイパスしてマップに直接追加することもできます。 – Rob

+0

'class tripSpot:NSObject、MKAnnotation { var title:String? var座標:CLLocationCoordinate2D var image:文字列? var場所:文字列? var type:String? VARのcllocation:CLLocation INIT(タイトル:文字列、座標:CLLocationCoordinate2D、所在地:文字列型:文字列、cllocation:CLLocation、画像:文字列){ self.title =タイトル self.coordinateを= 自己座標.image =画像 self.location =場所 self.type =タイプ self.cllocation = cllocation }} ' –

関連する問題