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
}
Ответы
Ответ 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
.