【问题标题】:MKPointAnnotation adding buttonMKPointAnnotation 添加按钮
【发布时间】:2018-04-06 20:09:46
【问题描述】:

我正在尝试向我的 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 中的 collectionviews 一样自动调用它)。对我接下来应该尝试什么的见解会很棒,因为总的来说,我觉得这应该很容易,但我错过了一些基本的东西。

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.
    }
    */

}

【问题讨论】:

  • mapView.delegate = self 在哪里?

标签: swift mkmapview swift4 mkmapviewdelegate


【解决方案1】:

当你添加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()
  }

}

然后添加注解

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 

 }

【讨论】:

  • 我能问一下pincolor的东西是从哪里来的吗?您似乎将其用作标识符
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-03-29
  • 2017-05-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多