Подтвердить что ты не робот

Swift - добавить MKAnnotationView в MKMapView

Я пытаюсь добавить MKAnnotationView в MKMapView, но я не могу этого сделать... Может ли кто-нибудь мне помочь?

Вот мой код:

override func viewDidLoad() {
    super.viewDidLoad()
    locationManager.desiredAccuracy = kCLLocationAccuracyBest
    locationManager.startUpdatingLocation()
    var latitude:CLLocationDegrees = locationManager.location.coordinate.latitude
    var longitude:CLLocationDegrees = locationManager.location.coordinate.longitude
    var homeLati: CLLocationDegrees = 40.01540192
    var homeLong: CLLocationDegrees = 20.87901079
    var latDelta:CLLocationDegrees = 0.01
    var longDelta:CLLocationDegrees = 0.01
    var theSpan:MKCoordinateSpan = MKCoordinateSpanMake(latDelta, longDelta)
    var myHome:CLLocationCoordinate2D = CLLocationCoordinate2DMake(homeLati, homeLong)
    var myLocation:CLLocationCoordinate2D = CLLocationCoordinate2DMake(latitude, longitude)
    var theRegion:MKCoordinateRegion = MKCoordinateRegionMake(myLocation, theSpan)
    self.theMapView.setRegion(theRegion, animated: true)
    self.theMapView.mapType = MKMapType.Hybrid
    self.theMapView.showsUserLocation = true
    ///Red Pin
    var myHomePin = MKPointAnnotation()
    myHomePin.coordinate = myHome
    myHomePin.title = "Home"
    myHomePin.subtitle = "Bogdan home"
    self.theMapView.addAnnotation(myHomePin)

    var anView:MKAnnotationView = MKAnnotationView()
    anView.annotation = myHomePin
    anView.image = UIImage(named:"xaxas")
    anView.canShowCallout = true
    anView.enabled = true
}
4b9b3361

Ответ 1

Вам нужно реализовать метод делегата viewForAnnotation и вернуть там MKAnnotationView.

Вот пример:

func mapView(mapView: MKMapView!, viewForAnnotation annotation: MKAnnotation!) -> MKAnnotationView! {
    if (annotation is MKUserLocation) {
        //if annotation is not an MKPointAnnotation (eg. MKUserLocation),
        //return nil so map draws default view for it (eg. blue dot)...
        return nil
    }

    let reuseId = "test"

    var anView = mapView.dequeueReusableAnnotationViewWithIdentifier(reuseId)
    if anView == nil {
        anView = MKAnnotationView(annotation: annotation, reuseIdentifier: reuseId)
        anView.image = UIImage(named:"xaxas")
        anView.canShowCallout = true
    }
    else {
        //we are re-using a view, update its annotation reference...
        anView.annotation = annotation
    }

    return anView
}

Помните, что вам нужно создать простой MKAnnotationView, если вы хотите использовать свой собственный образ. MKPinAnnotationView следует использовать только для стандартных аннотаций контактов.

Также обратите внимание, что вы не должны пытаться получить доступ к locationManager.location сразу после вызова startUpdatingLocation. Возможно, он еще не готов.

Используйте метод делегата didUpdateLocations.

Вам также необходимо вызвать requestAlwaysAuthorization/requestWhenInUseAuthorization (см. Службы местоположения, не работающие в iOS 8).

Ответ 2

1- ваш вид карты должен делегировать себя вашему контроллеру вида 2- вы должны реализовать

func mapView(aMapView: MKMapView!, viewForAnnotation annotation: CustomMapPinAnnotation!) -> MKAnnotationView!

эта функция вызывается из каждой аннотации, добавленной к вашей карте

3- подклассы ваших аннотаций, чтобы идентифицировать их в методе viewForAnnotation

4- in viewForNnotation, добавьте

if annotation.isKindOfClass(CustomMapPinAnnotation)
{
  // change the image here
var pinView = aMapView.dequeueReusableAnnotationViewWithIdentifier(reuseId) as? YourSubclassedAnnotation
  pinView!.image = UIImage(contentsOfFile: "xyz")
}

Ответ 3

Вы должны показать аннотацию, тогда вам нужно добавить метод аннотации показа:

let annotation = MKPointAnnotation()
mapVew.showAnnotations([annotation], animated: true)

annotation является экземпляром MKPointAnnotation.