Sam
Sam

Reputation: 1

Making MKPointAnnotation link with MKAnnotationView

I've been struggling with MapKit, I am developing an app that displays certain locations on a map. I have managed to add the pins via the MKPointAnnotation code using the coordinates, title and subtitle. I now want to add the callout button on the right hand side to go to a screen with further information about the place. I keep trying but to no avail. Can anybody help?

My code so far is:

import UIKit
import MapKit
import CoreLocation

class ViewController: UIViewController, MKMapViewDelegate, CLLocationManagerDelegate {

    @IBOutlet weak var map: MKMapView!

    var locationManager = CLLocationManager()

    class CustomPointAnnotation: MKPointAnnotation {
        var imageName: String!
    }

    override func viewDidLoad() {
        super.viewDidLoad()

        // Request location

        locationManager.delegate = self
        locationManager.desiredAccuracy = kCLLocationAccuracyBest
        locationManager.requestWhenInUseAuthorization()
        locationManager.startUpdatingLocation()

            self.map.showsUserLocation = true;

        // Map

        var latitude:CLLocationDegrees = 52.630886
        var longitude:CLLocationDegrees = 1.297355

        var latDelta:CLLocationDegrees = 0.05
        var lonDelta:CLLocationDegrees = 0.05

        var span:MKCoordinateSpan = MKCoordinateSpanMake(latDelta, lonDelta)

        var location:CLLocationCoordinate2D = CLLocationCoordinate2DMake(latitude, longitude)

        var region:MKCoordinateRegion = MKCoordinateRegionMake(location, span)

        map.setRegion(region, animated: true)

        // Castle 52.628599, 1.296355

        var castle = MKPointAnnotation()
        castle.coordinate.latitude = 52.628599
        castle.coordinate.longitude = 1.296355
        castle.title = "Norwich Castle"
        castle.subtitle = "Subtitle..."
        map.addAnnotation(castle)

        // Cathedral 52.631869, 1.300919

        var cathedral = MKPointAnnotation()
        cathedral.coordinate.latitude = 52.631869
        cathedral.coordinate.longitude = 1.300919
        cathedral.title = "Norwich Cathedral"
        cathedral.subtitle = "Subtitle..."
        map.addAnnotation(cathedral)

        // The Guildhall 52.629032, 1.292522

        var guildhall = MKPointAnnotation()
        guildhall.coordinate.latitude = 52.629032
        guildhall.coordinate.longitude = 1.292522
        guildhall.title = "The Guildhall"
        guildhall.subtitle = "Subtitle..."
        map.addAnnotation(guildhall)

        // The Halls 52.631120, 1.295712

        var halls = MKPointAnnotation()
        halls.coordinate.latitude = 52.631120
        halls.coordinate.longitude = 1.295712
        halls.title = "The Halls"
        halls.subtitle = "Subtitle..."
        map.addAnnotation(halls)

        // The Assembly House 52.626867, 1.290733

        var assembly = MKPointAnnotation()
        assembly.coordinate.latitude = 52.626867
        assembly.coordinate.longitude = 1.290733
        assembly.title = "The Assembly House"
        assembly.subtitle = "Subtitle..."
        map.addAnnotation(assembly)

        // Surrey House 52.625162, 1.293919

        var surrey = MKPointAnnotation()
        surrey.coordinate.latitude = 52.625162
        surrey.coordinate.longitude = 1.293919
        surrey.title = "Surrey House"
        surrey.subtitle = "Subtitle..."
        map.addAnnotation(surrey)

        // City Hall 52.628645, 1.291606

        var cityhall = MKPointAnnotation()
        cityhall.coordinate.latitude = 52.628645
        cityhall.coordinate.longitude = 1.291606
        cityhall.title = "City Hall"
        cityhall.subtitle = "Subtitle..."
        map.addAnnotation(cityhall)
    }

    func locationManager(manager: CLLocationManager!, didUpdateLocations locations: [AnyObject]!) {
        println(locations)
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
}

Is this good so far? Any help would be appreciated, this is my first app so in simple terms would be great!

Thanks,

Sam

Upvotes: 0

Views: 873

Answers (2)

binod_mandal
binod_mandal

Reputation: 427

You can set rightCalloutAccessoryView in MKPinAnnotationView instance..

here is sample code in objective c....

- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation {

    static NSString *identifier = your_identifier;

    MKPinAnnotationView *annotationView = (MKPinAnnotationView *) [_mapView dequeueReusableAnnotationViewWithIdentifier:identifier];
    if (annotationView == nil) {
    annotationView = [[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:identifier];
    } else {
    annotationView.annotation = annotation;
    }

    annotationView.enabled = YES;
    annotationView.canShowCallout = YES;
    annotationView.image=[UIImage imageNamed:@"arrest.png"];//here we use a nice image instead of the default pins


    //set right CalloutAccessoryView
    annotationView.rightCalloutAccessoryView =  UIButton.buttonWithType(buttonType: UIButtonTypeDetailDisclosure)

    return annotationView;

    }

Upvotes: 2

shinoys222
shinoys222

Reputation: 414

You may need to implement these mapview delegate methods

func mapView(_ mapView: MKMapView,
viewForAnnotation annotation: MKAnnotation) -> MKAnnotationView?
{
  return annotationView
}

and

func mapView(_ mapView: MKMapView,
           annotationView view: MKAnnotationView,calloutAccessoryControlTapped control: UIControl)
{
     // your action 
}

Upvotes: 0

Related Questions