Related classes:
- MKMapView: the map view to be shown on the screen- MKAnnotation: the info about your location such as coordinate and title
- MKAnnotationView: use it to define how the annotation (your location) looks on the map
1. Create a single application in Xcode
Suppose you already created the application in Xcode. There should be one View Controller in Interface Builder by default.
2. Update ViewController class as following:
import UIKit
import MapKit
class MapViewAnnotationDemoController: UIViewController, MKMapViewDelegate {
var mapView: MKMapView!
var myAnnotationsButton: UIButton!
private var myAnnotations = [MKAnnotation]()
private var currentAnnotationIndex: Int = 0
override func loadView() {
mapView = MKMapView()
mapView.delegate = self
view = mapView
}
override func viewDidLoad() {
initMyAnnotationsButton()
initMyAnnotations()
}
private func initMyAnnotationsButton() {
myAnnotationsButton = UIButton(frame: CGRect(x: 8, y:40, width: 140, height: 20))
myAnnotationsButton.setTitle("My Annotations", for: UIControlState.normal)
myAnnotationsButton.backgroundColor = UIColor.green
myAnnotationsButton.addTarget(self, action: #selector(showMyAnnotations(_:)), for: UIControlEvents.touchUpInside)
view.addSubview(myAnnotationsButton)
}
private func initMyAnnotations() {
let myBirthPlaceAnnotation = MKPointAnnotation()
myBirthPlaceAnnotation.title = "My Birth Place (title)"
myBirthPlaceAnnotation.subtitle = "My Birth Place (subtitle)"
myBirthPlaceAnnotation.coordinate.latitude = 11.5564
myBirthPlaceAnnotation.coordinate.longitude = 104.9282
myAnnotations.append(myBirthPlaceAnnotation)
let ruppAnnotation = MKPointAnnotation()
ruppAnnotation.title = "RUPP (title)"
ruppAnnotation.subtitle = "RUPP (subtitle)"
ruppAnnotation.coordinate.latitude = 11.5690
ruppAnnotation.coordinate.longitude = 104.8907
myAnnotations.append(ruppAnnotation)
mapView.addAnnotations(myAnnotations)
}
func showMyAnnotations(_ sender: UIButton) {
print("\nshowMyAnnotations() called")
if currentAnnotationIndex == myAnnotations.count - 1 {
currentAnnotationIndex = 0
} else {
currentAnnotationIndex += 1
}
mapView.showAnnotations([myAnnotations[currentAnnotationIndex]], animated: true)
}
func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? {
print("\nmapView(viewFor) called")
let pinAnnotationView = MKPinAnnotationView()
pinAnnotationView.annotation = annotation
pinAnnotationView.animatesDrop = true
return pinAnnotationView
}
}
In initMyAnnotations() method, we called mapView.addAnnotations(myAnnotations) method. And the addAnnotations() method calls the mapView(_:MKMapView, viewFor: MKAnnotation) method of the map view's delegate to get the instance of MKAnnotationView so the map view will know how to display the annotation. The delegate is the ViewController class in this case cause it extends MKMapViewDelegate and we set mapView.delegate to self.
No comments:
Post a Comment