iOS - Swift - 如何向MKPointAnnotaton添加按钮 - MapKit

时间:2016-07-28 09:29:55

标签: ios swift swift2 mapkit

目前我有一个地图视图,其中设置了5个硬编码位置,这些位置在地图上显示了引脚。当用户点击这些引脚时,会向用户显示一个标注,其中包含该位置的详细信息。在这些标注中,我试图包含一个用户可以按下的按钮,然后将它们带到另一个视图控制器。

下面是我当前的代码,但是当我点击引脚时没有显示按钮,是否有人知道我缺少什么或者我需要做什么才能实现按钮?

以下是我的位置代码和当前用户位置。

&>     # redirects stdout and stderr
>(cmd) # redirects to a process

这是callout中按钮实现的代码(不起作用)

import UIKit
import MapKit
import CoreLocation
import SceneKit

class SecondViewController: UIViewController, MKMapViewDelegate, CLLocationManagerDelegate
{
    @IBOutlet weak var mapView: MKMapView!

//Location manager property
let locationManager = CLLocationManager()

override func viewDidLoad()
{
    super.viewDidLoad()

    mapView.delegate = self

    //Find the current location as soon as the view is loaded
    self.locationManager.delegate = self

    //Setting the accuracy
    self.locationManager.desiredAccuracy = kCLLocationAccuracyBest

    //So only location services are used within the app
    self.locationManager.requestWhenInUseAuthorization()

    //Start up the location manager and find current location
    self.locationManager.startUpdatingLocation()

    //Use blue pin to show the location to the user
    self.mapView.showsUserLocation = true

    //Array of dictionaries to store the locations
    let locationData = [

        //Radio City Tower
        ["name": "Radio City Tower",
        "latitude": 53.4071551,
        "longitude": -2.980798600000071],

        //Metropolitian Cathedral
        ["name": "Metropolitian Catherdral",
         "latitude": 53.40494649999999,
         "longitude": -2.9684022999999797],

        //Walker Art Gallery
        ["name": "Walker Art Gallery",
            "latitude": 53.410068,
            "longitude": -2.979666],

        //Liver Buildings
        ["name": "Liver Buildings",
            "latitude": 53.405808,
            "longitude": -2.995859],

        //St George's Hall
        ["name": "St George's Hall",
            "latitude": 53.409277,
            "longitude": -2.979946]
    ]

    //Object for each dictionary in the locations array
    var annotations = [MKPointAnnotation]()

    //Populating the map with the location pins
    for Dictionary in locationData {
        let latitude = CLLocationDegrees(Dictionary["latitude"] as! Double)
        let longitude = CLLocationDegrees(Dictionary["longitude"] as! Double)
        let coordinate = CLLocationCoordinate2D(latitude: latitude, longitude: longitude)
        let name = Dictionary["name"] as! String
        let annotation = MKPointAnnotation()

        //Apply to annotation
        annotation.coordinate = coordinate
        annotation.title = "\(name)"
        annotations.append(annotation)


    }

    mapView.addAnnotations(annotations)

}

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

// MARK: - Location Delegate Methods

func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation])
{
    //Gets the most current location
    let location = locations.last

     //gets the center of the last location
    let center = CLLocationCoordinate2D(latitude: location!.coordinate.latitude, longitude: location!.coordinate.longitude)

    //Creatng a region - Map will zoom to this
    let region = MKCoordinateRegion(center: center, span: MKCoordinateSpan(latitudeDelta: Double(0.004), longitudeDelta: Double(0.004)))

    //Apply the map view to the region
    self.mapView.setRegion(region, animated: true)

    //Stop updating the location
    self.locationManager.stopUpdatingLocation()

    let currentLocation = CLLocationCoordinate2DMake(location!.coordinate.latitude, location!.coordinate.longitude)

    //Adding an annotation to current user location
    var pinAnnotation = MKPointAnnotation()

    //Set pin coordinate to the users current location
    pinAnnotation.coordinate = currentLocation

    //Annotation title
    pinAnnotation.title = "Current Location"

    //Annotation subtitle
    pinAnnotation.subtitle = "You are here!"

    //Add the pin to the mapView
    mapView.addAnnotation(pinAnnotation)

}

我可能错过了一些非常简单的东西,但我不确定是什么。我是iOS / Swift开发的新手,也是MapKit,所以请耐心等待。我也明白这个问题已被多次询问,但我仍然无法解决这个问题。感谢任何帮助,谢谢。

1 个答案:

答案 0 :(得分:0)

你在下面的callout方法中犯了一个小错误,你明确地解开了 MKAnnotationView! MKMapView!。这是我已经测试过的更正的。

func mapView(mapView: MKMapView, viewForAnnotation annotation: MKAnnotation) -> MKAnnotationView? {
    print("viewForAnnotation")
    if(annotation is MKUserLocation) {
        return nil
    }
    let reuseID = "pin"
    var pinView = mapView.dequeueReusableAnnotationViewWithIdentifier(reuseID) as? MKPinAnnotationView
    if(pinView == nil) {
        pinView = MKPinAnnotationView(annotation: annotation, reuseIdentifier: reuseID)
        pinView!.canShowCallout = true
        pinView!.animatesDrop = true
    }
    let button = UIButton()
    button.frame = CGRect(x: 0, y: 0, width: 30, height: 30)
    let image = UIImage(named: "img.png")
    button.setImage(image, forState: .Normal)
    pinView?.rightCalloutAccessoryView = button
    return pinView
}