I managed to get a custom icon for a annotation pin in Swift, but now I am still stuck using 2 different images for different annotations. Right now a button adds a annotation to the map. There should be another button that also adds a annotation but with another icon.
Is there a way to use the reuseId for this?
class ViewController: UIViewController, MKMapViewDelegate {
@IBOutlet weak var Map: MKMapView!
@IBAction func btpressed(sender: AnyObject) {
var lat:CLLocationDegrees = 40.748708
var long:CLLocationDegrees = -73.985643
var latDelta:CLLocationDegrees = 0.01
var longDelta:CLLocationDegrees = 0.01
var span:MKCoordinateSpan = MKCoordinateSpanMake(latDelta, longDelta)
var location:CLLocationCoordinate2D = CLLocationCoordinate2DMake(lat, long)
var region:MKCoordinateRegion = MKCoordinateRegionMake(location, span)
Map.setRegion(region, animated: true)
var information = MKPointAnnotation()
information.coordinate = location
information.title = "Test Title!"
information.subtitle = "Subtitle"
Map.addAnnotation(information)
}
func mapView(mapView: MKMapView!, viewForAnnotation annotation: MKAnnotation!) -> MKAnnotationView! {
if !(annotation is MKPointAnnotation) {
return nil
}
let reuseId = "test"
var anView = mapView.dequeueReusableAnnotationViewWithIdentifier(reuseId)
if anView == nil {
anView = MKAnnotationView(annotation: annotation, reuseIdentifier: reuseId)
anView.image = UIImage(named:"1.png")
anView.canShowCallout = true
}
else {
anView.annotation = annotation
}
return anView
}
In the
viewForAnnotation
delegate method, set theimage
based on whichannotation
the method is being called for.Be sure to do this after the view is dequeued or created (and not only in the
if anView == nil
part). Otherwise, annotations that use a dequeued view will show the image of the annotation that used the view previously.With the basic
MKPointAnnotation
, one crude way to tell annotations apart is by theirtitle
but that's not very flexible.A better approach is to use a custom annotation class that implements the
MKAnnotation
protocol (an easy way to do that is to subclassMKPointAnnotation
) and add whatever properties are needed to help implement the custom logic.In the custom class, add a property, say
imageName
, which you can use to customize the image based on the annotation.This example subclasses
MKPointAnnotation
:Create annotations of type
CustomPointAnnotation
and set theirimageName
:In
viewForAnnotation
, use theimageName
property to set the view'simage
:iOS Swift Code With Help of Anna and Fabian Boulegue: