MKPointAnnotation添加按钮

时间:2018-04-06 20:09:47

标签: swift mkmapview swift4 mkmapviewdelegate

我正在尝试添加一个按钮然后执行新的viewcontroller到我的MKPointAnnotations

我仔细研究了这两个问题

How to add button to MKPointAnnotation in Swift

How to add a button to the MKPointAnnotation?

他们都有

func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation)
-> MKAnnotationView? {

作为解决方案的一部分,但是当我实现这个函数时,它没有被调用(我假设它的意思是自动调用,就像在tableviews中的单元格或swift中的集合视图一样)。一个洞察力是我接下来应该尝试的将是惊人的,因为总体而言我觉得这应该是容易的我缺少一些基本的东西。

import UIKit
import Foundation
import MapKit
import CoreLocation

class MapViewController: UIViewController, CLLocationManagerDelegate, MKMapViewDelegate {

    var screenWidth : CGFloat = 0.0
    var screenHeight : CGFloat = 0.0

    var mapView = MKMapView()

    var annotations : [MKPointAnnotation] = []

    var annotationView = MKAnnotationView()

    let lm = CLLocationManager()

    let regionRadius: CLLocationDistance = 1000

    var flag : Bool = false

    override func viewDidLoad() {
        super.viewDidLoad()

        screenWidth = UIScreen.main.bounds.width
        screenHeight = UIScreen.main.bounds.height

        mapView.frame = CGRect(x: 0, y: 0, width: screenWidth, height: screenHeight)
        self.view.addSubview(mapView)
        lm.delegate = self
        lm.desiredAccuracy = kCLLocationAccuracyBest
        lm.requestWhenInUseAuthorization()
        lm.startUpdatingLocation()


        let detailButton: UIButton = UIButton(type: UIButtonType.detailDisclosure) as UIButton
        annotationView.rightCalloutAccessoryView = detailButton

        // Do any additional setup after loading the view.
    }

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


    func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
            let coordinateRegion = MKCoordinateRegionMakeWithDistance(locations[locations.count-1].coordinate, regionRadius * 0.5, regionRadius * 0.5)
            mapView.setRegion(coordinateRegion, animated: true)


        if flag == false {
            addAnnotation(latitude: locations[locations.count-1].coordinate.latitude, longitude: locations[locations.count-1].coordinate.longitude)
            flag = true
        }
    }

    func addAnnotation(latitude: Double, longitude: Double){
        let annotation = MKPointAnnotation()
        annotation.coordinate.latitude = latitude
        annotation.coordinate.longitude = longitude
        annotation.title = "here"

        annotations.append(annotation)

        mapView.addAnnotation(annotations[0])
    }



    func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? {

        print("fuddddge not working")

        let pinView = MKPinAnnotationView()
        return pinView

    }



    /*
    // MARK: - Navigation

    // In a storyboard-based application, you will often want to do a little preparation before navigation
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        // Get the new view controller using segue.destinationViewController.
        // Pass the selected object to the new view controller.
    }
    */

}

1 个答案:

答案 0 :(得分:0)

添加MKAnnotation类型的注释时会调用此方法,因此您应首先创建MKAnnotation

的子类
//  add them inside MKAnnotation class below import

func == (left: PinColor, right: PinColor) -> Bool
{
  return left.rawValue == right.rawValue
}
enum PinColor : String
{
    case Blue = "Blue"
    case Red = "Red"
    case Green = "Green"
    case Purple = "Purple"

    /* We convert our pin color to the system pin color */
    func toPinColor() -> MKPinAnnotationColor
    {
        switch self
        {
        case .Red:
            return .red
        case .Green:
            return .green
        case .Purple:
            return .purple
        default:
            return .red
        }
    }
}


class MyAnnotation: NSObject, MKAnnotation
{
  var coordinate: CLLocationCoordinate2D = CLLocationCoordinate2DMake(0, 0)
  var title: String!
  var subtitle: String!
  var pinColor: PinColor!

  init(coordinate: CLLocationCoordinate2D, title: String,
     subtitle: String,
     pinColor: PinColor)
  {
     self.coordinate = coordinate
     self.title = title
     self.subtitle = subtitle
     self.pinColor = pinColor
     super.init()
  }

}

然后添加annoation

let blueLocation = CLLocationCoordinate2D(latitude: ..... , longitude: .... )

let blueAnnotation = MyAnnotation(coordinate: blueLocation, title:"",subtitle: "",pinColor: .Green) 

self.myMapView.addAnnotation(blueAnnotation)

//

func mapView(_ mapView: MKMapView,viewFor annotation: MKAnnotation) -> MKAnnotationView?
{
    if annotation is MyAnnotation == false
    {

        return nil
    }

    let senderAnnotation = annotation as! MyAnnotation

    let pinReusableIdentifier = senderAnnotation.pinColor.rawValue

    var annotationView = mapView.dequeueReusableAnnotationView(withIdentifier: pinReusableIdentifier)

    if annotationView == nil
    {            
        annotationView = MKAnnotationView(annotation: senderAnnotation,                                                                                                reuseIdentifier: pinReusableIdentifier)
        annotationView!.canShowCallout = true
    } 

    if senderAnnotation.pinColor == PinColor.Green
    {
         let pinImage = UIImage(named:"name.png")

         annotationView!.image = pinImage

    }

    return annotationView 

 }