2016-07-14 1 views
1

주석을 사용하여 간단한지도를 만들려고합니다.하지만 실행하려고하면 detailCalloutAccessoryView의 이미지는 동일하지만 두 개의 다른 이미지를 넣을 것입니다. 어떻게 했습니까? 이 일이 일어날까요? 아니면 누구든지이 일을하는 더 좋은 방법이 있을까요?신속한 mapkit 주석이 같은 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 항목을 참조하는 속성을 추가하면 표시 할 이미지를 식별 할 수 있습니다. 그런 다음 viewForAnnotationtripspot 배열을 반복하지 않고 사용자 정의 주석 하위 클래스에서 해당 속성을 검색해야합니다. 또한 기본 tripspot 항목에 대한 참조를 포함함으로써 이제는 "세부 액세서리 선택"루틴을 통해 연결된 트림 스팟을 알 수 있고 적절한 조치를 취할 수 있습니다.

제쳐두고 잠재적 인 주석의 수는 모르겠지만 이미지의 이름보다는 tripspot 어레이의 이미지 이름을 저장하는 것이 더 신중할 수 있습니다. 이미지가 비교적 크고 많은 주석이있는 경우 메모리 문제가 발생할 위험이 있습니다. 배열을 실제 이미지로 채우는 대신 필요에 따라 UIImage 개체를 인스턴스화하는 것이 일반적으로 더 신중합니다.

+0

안녕하세요 @ 롭, 당신의 설명을 이해하지 못하겠습니까? 모든 이미지를 각 주석에 추가해야합니까? 죄송합니다. 영어가 제 모국어가 아닙니다. 완전히 이해하기가 어렵습니다. –

+0

@JohnnyHsieh - 아마도 쉽습니다.'TripSpot' 클래스가'MKAnnotation'을 따르도록 고려한 다음'MKPointAnnotation'을 우회하여지도에 직접 추가 할 수 있습니다. – Rob

+0

'class tripSpot : NSObject, MKAnnotation { var title : String? var 좌표 : CLLocationCoordinate2D var image : 문자열? var 위치 : 문자열? var 유형 : 문자열? VAR의 cllocation : CLLocation INIT (제목 : 문자열 좌표 CLLocationCoordinate2D 위치 : 문자열 타입 : 스트링 cllocation : CLLocation 이미지 : 문자열) { self.title = 표제 self.coordinate을 = 자기 좌표 이미지입니다 = 이미지 self.location = 위치 self.type = 유형 self.cllocation = cllocation } }' –

관련 문제