Swift MapKit 按下按钮更改坐标

Posted

技术标签:

【中文标题】Swift MapKit 按下按钮更改坐标【英文标题】:Swift MapKit press button to change coordinates 【发布时间】:2018-08-20 13:28:25 【问题描述】:

我想这样做:

在 mapView 我有 3 个按钮。当应用程序第一次运行时 - 坐标最初从 1 个按钮显示。使用时按第二个或另一个按钮 - 坐标更改为另一个

var lang = 40.7143528
var long = -74.0059731
let annotation = MKPointAnnotation()

  override func viewDidLoad() 
    super.viewDidLoad()
    mapView.delegate = self

    let distanceSpan: CLLocationDegrees = 2000
    let bsuCSCampus: CLLocationCoordinate2D = CLLocationCoordinate2DMake(lang, long)

    mapView.setRegion(MKCoordinateRegionMakeWithDistance(bsuCSCampus, distanceSpan, distanceSpan), animated: true)

    annotation.coordinate = bsuCSCampus
    annotation.title = "Big Ben"
    mapView.addAnnotation(annotation)
    mapView.selectAnnotation(annotation, animated: true)


    @IBAction func firstBtn(_ sender: UIButton) 
    lang = 40.7143528
    long = -74.0059731


@IBAction func secondBtn(_ sender: UIButton) 
    lang = 40.69144874
    long = -73.9290688


@IBAction func thirdBtn(_ sender: UIButton) 
    lang = 40.63728056
    long = -73.9455483

但是当我按下任何按钮时,什么都没有发生

【问题讨论】:

你想要发生什么?是否要将注释更改为您点击的注释?您希望地图重新以新位置为中心吗?两样东西? @DuncanC 两件事 你在 viewDidLoad 中所做的事情应该在每个 action 中完成,加上删除注释 【参考方案1】:

当然什么都不会发生。您有 2 个实例变量,lat 和 long,而您的 IBAction 只是更改这些实例变量。它们与地图显示的内容无关

如果您希望一次只显示一个注释,并且希望每次都以该注释为中心,您应该:

创建函数showAnnotationAt(coord: CLLocationCoordinate2D)

在那个函数中:

删除所有注释 在指定坐标处添加注解 以该坐标居中地图。

现在从 viewDidLoad() 和所有按钮操作中调用该函数。

看看你是否能弄清楚如何编写代码。如果遇到问题,请发布您的代码,有人会帮助您调试它。请不要让我为您编写该代码。

【讨论】:

【参考方案2】:

我建议您使用一个函数来添加注释并对其进行缩放:

func addAnnotation(lang: Double, long: Double, title: String) 
    let annotation = MKPointAnnotation()

    let location: CLLocationCoordinate2D = CLLocationCoordinate2DMake(lang, long)

    mapView.setRegion(MKCoordinateRegionMakeWithDistance(location, distanceSpan, distanceSpan), animated: true)

    annotation.coordinate = location
    annotation.title = title
    mapView.addAnnotation(annotation)
    mapView.selectAnnotation(annotation, animated: true)

这将使您的代码如下所示:

var lang = 40.7143528
var long = -74.0059731
let distanceSpan: CLLocationDegrees = 2000


override func viewDidLoad() 
    super.viewDidLoad()
    mapView.delegate = self

点击按钮将调用此函数,并带有所需的langlong 和注释标题:

@IBAction func firstBtn(_ sender: UIButton) 
    addAnnotation(lang: 40.7143528, long: -74.0059731, title: "Big Ben")


@IBAction func secondBtn(_ sender: UIButton) 
    addAnnotation(lang: 40.69144874, long: -73.9290688, title: "963 Greene Ave, ***lyn")


@IBAction func thirdBtn(_ sender: UIButton) 
    addAnnotation(lang: 40.63728056, long: -73.9455483, title: "585 E 32nd St, ***lyn")

如果您有一组位置字典:

var locations = [["latitude": 40.7143528, "longitude": -74.0059731],
                 ["latitude": 40.69144874, "longitude": -73.9290688],
                 ["latitude": 40.63728056, "longitude": -73.9455483]]

那么你可以使用这个函数:

func addAnnotations(From arrayOfLocations : [[String : Double]]) 
    let annotations: [MKPointAnnotation] = arrayOfLocations.map locationDictionary in
        guard let latitude = locationDictionary["latitude"], let longitude = locationDictionary["longitude"] else 
            fatalError("Wrong coordinates")
        
        let annotation = MKPointAnnotation()
        annotation.coordinate = CLLocationCoordinate2DMake(latitude, longitude)
        return annotation
    
    mapView.addAnnotations(annotations)
    mapView.showAnnotations(annotations, animated: true)
 

【讨论】:

好的,谢谢。对于一个注释很好,如果会有更多的注释?创建 var location = [[“纬度”:40.7143528,“经度”:-74.0059731],[“纬度”:40.69144874,“经度”:-73.9290688],[“纬度”:40.63728056,“经度”:-73.9455483]] ? @Andrew0 更新了答案。如果此代码对您有所帮助,请不要忘记将此答案标记为正确答案。

以上是关于Swift MapKit 按下按钮更改坐标的主要内容,如果未能解决你的问题,请参考以下文章

Swift:当按下按钮时更改按钮样式并重设其他按钮

按下 xcode 7 / Swift 2 时如何更改按钮的图像? [复制]

Swift中按钮的坐标

在 Swift 中按下 uibutton 时更改色调图像颜色

在地图 Swift 上选择注释时坐标为零

如何以编程方式在 Mapkit 中选择特定注释 - Swift