Swift MapKit 按下按钮改变坐标
Swift MapKit press button to change coordinates
我想这样做:
在 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
}
但是当我按下任何按钮时没有任何反应
当然什么也没有发生。您有 2 个实例变量,lat 和 long,而您的 IBAction 只是更改这些实例变量。他们与地图显示的内容无关。
如果您一次只希望显示一个注释,并且每次都希望地图以该注释为中心,您应该:
创建函数showAnnotationAt(coord: CLLocationCoordinate2D)
在该函数中:
- 删除所有注释
- 在指定坐标处添加注释
- 将地图置于该坐标的中心。
现在从 viewDidLoad() 和所有按钮操作中调用该函数。
看看你是否能想出如何编写代码。如果遇到问题,post 您的代码,有人会帮助您调试它。 不要让我为您编写代码。
我建议您使用一个功能来添加注释并对其进行缩放:
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
}
点击按钮将使用所需的 lang
、long
和注释标题调用此函数:
@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, Brooklyn")
}
@IBAction func thirdBtn(_ sender: UIButton) {
addAnnotation(lang: 40.63728056, long: -73.9455483, title: "585 E 32nd St, Brooklyn")
}
如果您有一组位置字典:
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)
}
我想这样做:
在 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
}
但是当我按下任何按钮时没有任何反应
当然什么也没有发生。您有 2 个实例变量,lat 和 long,而您的 IBAction 只是更改这些实例变量。他们与地图显示的内容无关。
如果您一次只希望显示一个注释,并且每次都希望地图以该注释为中心,您应该:
创建函数showAnnotationAt(coord: CLLocationCoordinate2D)
在该函数中:
- 删除所有注释
- 在指定坐标处添加注释
- 将地图置于该坐标的中心。
现在从 viewDidLoad() 和所有按钮操作中调用该函数。
看看你是否能想出如何编写代码。如果遇到问题,post 您的代码,有人会帮助您调试它。 不要让我为您编写代码。
我建议您使用一个功能来添加注释并对其进行缩放:
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
}
点击按钮将使用所需的 lang
、long
和注释标题调用此函数:
@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, Brooklyn")
}
@IBAction func thirdBtn(_ sender: UIButton) {
addAnnotation(lang: 40.63728056, long: -73.9455483, title: "585 E 32nd St, Brooklyn")
}
如果您有一组位置字典:
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)
}