2014-11-18 1 views
7

MKPointAnnotations의 형태로 map에있는 핀을 어떻게 만질 수 있는지 알려주고 싶습니다.신속한 MKPointAnnotations 터치 이벤트

나는 mappin을 클릭하고 내가 미리 설정 한 pinvariables를 다시 가져 와서 다른보기로 이동하고 싶은

.

아무도 나에게이 것을 설명 할 수 있습니까 Swift?

덕분에 코드

편집 :

class ViewController: UIViewController, MKMapViewDelegate { 


@IBOutlet weak var mappa: MKMapView! 


override func viewDidLoad() { 
    super.viewDidLoad() 

    var location : CLLocationCoordinate2D = CLLocationCoordinate2D(latitude: 44.648590, longitude: 10.918794) 

    let pinAnnotation = PinAnnotation() 
    pinAnnotation.setCoordinate(location) 

    self.mappa.addAnnotation(pinAnnotation) 

} 

class PinAnnotation : NSObject, MKAnnotation { 
    private var coord: CLLocationCoordinate2D = CLLocationCoordinate2D(latitude: 0, longitude: 0) 

    var coordinate: CLLocationCoordinate2D { 
     get { 
      return coord 
     } 
    } 

    var title: String = "test" 
    var subtitle: String = "test" 

    func setCoordinate(newCoordinate: CLLocationCoordinate2D) { 
     self.coord = newCoordinate 
    }   
} 

func mapView(mapView: MKMapView!, viewForAnnotation annotation: MKAnnotation!) -> MKAnnotationView! { 
    if annotation is PinAnnotation { 
     let pinAnnotationView = MKPinAnnotationView(annotation: annotation, reuseIdentifier: "myPin") 

     pinAnnotationView.pinColor = .Purple 
     pinAnnotationView.draggable = true 
     pinAnnotationView.canShowCallout = true 
     pinAnnotationView.animatesDrop = true 

     let deleteButton = UIButton.buttonWithType(UIButtonType.Custom) as UIButton 
     deleteButton.frame.size.width = 44 
     deleteButton.frame.size.height = 44 
     deleteButton.backgroundColor = UIColor.redColor() 
     deleteButton.setImage(UIImage(named: "trash"), forState: .Normal) 

     pinAnnotationView.leftCalloutAccessoryView = deleteButton 


     return pinAnnotationView 
    } 

    return nil 
} 

func mapView(mapView: MKMapView!, annotationView view: MKAnnotationView!, calloutAccessoryControlTapped control: UIControl!) { 
    if let annotation = view.annotation as? PinAnnotation { 
     self.mapView.removeAnnotation(annotation) 
    } 
} 
} 
+0

주석의 제목이 비어 있으면 당신이 그것을 누를 때, 선이 표시되지 않습니다. – Anna

+0

주석과 서면 텍스트를 추가했는데 팝업이 제대로 나오지만 아무 것도하지 않습니다. 왜 그런지 압니까? –

+0

지도보기의 대리자 콘센트가 연결되지 않았거나 설정되지 않았을 수 있습니다. – Anna

답변

20

몇 가지 단계가 여기, 필요하면 시작하는 몇 가지 코드 조각입니다.

먼저 작업 할 데이터가 들어있는 핀 주석에 대한 맞춤 클래스가 필요합니다.

import MapKit 
import Foundation 
import UIKit 

class PinAnnotation : NSObject, MKAnnotation { 
    private var coord: CLLocationCoordinate2D = CLLocationCoordinate2D(latitude: 0, longitude: 0) 

    var coordinate: CLLocationCoordinate2D { 
     get { 
      return coord 
     } 
    } 

    var title: String = "" 
    var subtitle: String = "" 

    func setCoordinate(newCoordinate: CLLocationCoordinate2D) { 
     self.coord = newCoordinate 
    }   
} 

그런 다음 당신은 MKMapViewDelegate 프로토콜을 준수하여 MKMapView에 대한 사용자 정의 클래스가 필요합니다.

import MapKit 
import CLLocation 
import Foundation 
import UIKit 

class MapViewController: UIViewController, MKMapViewDelegate { 

    ... 

    func mapView(mapView: MKMapView!, viewForAnnotation annotation: MKAnnotation!) -> MKAnnotationView! { 
     if annotation is PinAnnotation { 
      let pinAnnotationView = MKPinAnnotationView(annotation: annotation, reuseIdentifier: "myPin") 

      pinAnnotationView.pinColor = .Purple 
      pinAnnotationView.draggable = true 
      pinAnnotationView.canShowCallout = true 
      pinAnnotationView.animatesDrop = true 

      let deleteButton = UIButton.buttonWithType(UIButtonType.Custom) as UIButton 
      deleteButton.frame.size.width = 44 
      deleteButton.frame.size.height = 44 
      deleteButton.backgroundColor = UIColor.redColor() 
      deleteButton.setImage(UIImage(named: "trash"), forState: .Normal) 

      pinAnnotationView.leftCalloutAccessoryView = deleteButton 

      return pinAnnotationView 
     } 

     return nil 
    } 

    func mapView(mapView: MKMapView!, annotationView view: MKAnnotationView!, calloutAccessoryControlTapped control: UIControl!) { 
     if let annotation = view.annotation as? PinAnnotation { 
      mapView.removeAnnotation(annotation) 
     } 
    } 

당신에게 같은 것을 제공합니다 :

let pinAnnotation = PinAnnotation() 
pinAnnotation.setCoordinate(location) 

mapView.addAnnotation(pinAnnotation) 
+0

안녕하세요, viewDidLoad를 사용하여지도상의 점을 격벽으로로드 할 수 있습니까? 지도에 핀을 추가하는 방법을 알 수 없습니다. –

+0

지도에 새 핀을 추가하는 방법을 보여주기 위해 내 대답을 편집했습니다. – zisoft

+0

코드에 내 질문을 편집했습니다. 이제지도에 핀이 표시되지만, 아무 것도 클릭하지 않으면 툴팁이 나타나지 않습니다. 어떻게 수정합니까? –

3
:

enter image description here

코드에서이 곳을 사용하여지도에 새로운 주석을 추가하려면이 방법 viewForAnnotation를 구현

Greate work !!! 하지만 .. 난 그냥 과거를 복사하고 몇 가지 변경 사항을 추가했다. 나는 그 변화를 여러분과 함께 나눌 것입니다.

import MapKit 
import Foundation 
import UIKit 

class PinAnnotation : NSObject, MKAnnotation { 
private var coord: CLLocationCoordinate2D = CLLocationCoordinate2D(latitude: 0, longitude: 0) 
private var _title: String = String("") 
private var _subtitle: String = String("") 

var title: String? { 
    get { 
     return _title 
    } 
    set (value) { 
     self._title = value! 
    } 
} 

var subtitle: String? { 
    get { 
     return _subtitle 
    } 
    set (value) { 
     self._subtitle = value! 
    } 
} 

var coordinate: CLLocationCoordinate2D { 
    get { 
     return coord 
    } 
} 

func setCoordinate(newCoordinate: CLLocationCoordinate2D) { 
    self.coord = newCoordinate 
} 
} 

나는 그것이 도움이되기를 바랍니다 : D