1

我正在尝试在 Swift 中使用 MapKit。我需要在地图的区域显示当前用户位置和它旁边的兴趣点,但是这些兴趣点必须具有不同的可视化用户本身模式。我知道需要实现 MapViewAnnotation 的委托,放入我的代码中它不会运行。有人可以帮我举个例子吗?

这是我的代码。

import UIKit
import MapKit

class ViewController: UIViewController, MKMapViewDelegate {

    @IBOutlet weak var mapView: MKMapView!

    override func viewDidLoad() {
        super.viewDidLoad()


        let latArray = [-23.528657, -23.518514, -23.533796, -23.533796]
        let longArray = [-46.484008, -46.486495, -46.495533, -46.476690]

        var lat: CLLocationDegrees = -23.527096772791133
        var long: CLLocationDegrees = -46.48964569157911

        var latDelta: CLLocationDegrees = 0.01
        var longDelta: CLLocationDegrees = 0.01

        var theSpan: MKCoordinateSpan = MKCoordinateSpanMake(latDelta,longDelta)

        var mypos: CLLocationCoordinate2D = CLLocationCoordinate2DMake(lat,long)

        var myreg: MKCoordinateRegion = MKCoordinateRegionMake(mypos, theSpan)

        self.mapView.setRegion(myreg, animated: true)

        var myposannot = MKPointAnnotation()

        myposannot.coordinate = mypos
        myposannot.title = "Me"
        myposannot.subtitle = "I am here!"

        self.mapView.addAnnotation(myposannot)

        for var i=0; i<4; ++i {

            var latCli: CLLocationDegrees = latArray[i]
            var longCli: CLLocationDegrees = longArray[i]

            var myposCli : CLLocationCoordinate2D = CLLocationCoordinate2DMake(latCli,longCli)

            var myposannotCli = MKPointAnnotation()

            myposannotCli.coordinate = myposCli
            myposannotCli.title = "Cliente" + " - " + String (i)
            myposannotCli.subtitle = "Anotacao" + " - " + String (i)


            self.mapView.addAnnotation(myposannotCli)
        }
    }

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

    func mapViewAnnot(mapViewAnnot: MKMapView!,ViewForAnnotation annotation: MKAnnotation!) ->MKAnnotationView{

        if annotation is MKUserLocation{
            return nil
        }

        let reuseId = "pin"

        var pinView = mapViewAnnot.dequeueReusableAnnotationViewWithIdentifier(reuseId)   as? MKPinAnnotationView

        if(pinView == nil){
            pinView = MKPinAnnotationView(annotation: annotation, reuseIdentifier: reuseId)
            pinView!.canShowCallout = true
            pinView!.animatesDrop = true
            pinView!.pinColor = .Red
            pinView!.rightCalloutAccessoryView = UIButton.buttonWithType(.DetailDisclosure) as UIButton
        } else {
            pinView!.annotation = annotation
        }
        return pinView!
    }

}
4

2 回答 2

2

代码有两个主要问题:

  1. 委托方法未正确命名,viewForAnnotation因此地图视图不会调用它。目前的方法声明是这样的:

    func mapViewAnnot(mapViewAnnot: MKMapView!,
        ViewForAnnotation annotation: MKAnnotation!) ->MKAnnotationView {
    

    是错的。应该是这样的:

    func mapView(mapView: MKMapView!, 
        viewForAnnotation annotation: MKAnnotation!) -> MKAnnotationView! {
    

    该方法必须命名为mapView(mapView:viewForAnnotation:).

  2. 另一个问题是这一行:

    var pinView = mapViewAnnot.dequeueReusableAnnotationViewWithIdentifier(reuseId)   as? MKPinAnnotationView
    

    对某个名为的对象的引用mapViewAnnot是没有意义的,并且必须阻止代码编译。该行应该是这样的:

    var pinView = mapView.dequeueReusableAnnotationViewWithIdentifier(reuseId) as? MKPinAnnotationView
    
于 2014-09-24T03:00:42.843 回答
0

导入 UIKit 导入 MapKit

类视图控制器:UIViewController {

@IBOutlet weak var mapv: MKMapView!
override func viewDidLoad() {
    super.viewDidLoad()
    
    mapv.mapType = .satellite
    let location = CLLocationCoordinate2D(latitude: 11.361516, longitude: 76.30274)
    let span = MKCoordinateSpan(latitudeDelta: 0.005, longitudeDelta: 0.005)
    let region = MKCoordinateRegion(center: location, span: span)
    mapv.setRegion(region, animated: true)
    
    
    
    let annotation = MKPointAnnotation()
    annotation.coordinate = location
    annotation.title = "Edakkara"
    annotation.subtitle = "Nilambur"
    mapv.addAnnotation(annotation)
    
于 2021-11-12T09:42:34.450 回答