平移到新的 mapView 注释位置 - 不缩放
Pan to new mapView Annotation Location - not zoom
使用 mapView.addAnnotation 将注释添加到我的 mapView 时,mapView.setRegion
会正确设置动画并显示地图的中心和跨度。
但是当添加新注释然后调用 mapView.setRegion
时,视图再次从非常宽的地方开始,然后 animates/zooms 进入新的中心和跨度。
我想知道是否有办法从以前的区域平移到新区域(中心和跨度),而不是开始缩小,然后再次放大。
mapView.setRegion
每次都从这里开始缩放:
我定义了 2 个自定义 类:MarkAnnotation
& MarkAnnotationView
class MarkAnnotation : NSObject, MKAnnotation {
var coordinate: CLLocationCoordinate2D
var title: String?
var subtitle: String?
init(coordinate: CLLocationCoordinate2D, title: String, subtitle: String) {
self.coordinate = coordinate
self.title = title
self.subtitle = subtitle
}
}
class MarkAnnotationView: MKAnnotationView {
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
override init(annotation: MKAnnotation?, reuseIdentifier: String?) {
super.init(annotation: annotation, reuseIdentifier: reuseIdentifier)
guard let markAnnotation = self.annotation as? MarkAnnotation else { return }
image = UIImage(named: "customAnnotation")
}
}
在我的 MKMapViewDelegate
中:
func addMarkAnnotation() {
for mark in marks {
let markName : String = mark.name
let markLat : Double = mark.lat
let markLon : Double = mark.lon
let markLL = CLLocationCoordinate2DMake(markLat, markLon)
let markAnnotation = MarkAnnotation(coordinate:markLL, title:markNumStr, subtitle: markName)
mapView.addAnnotation(markAnnotation)
}
}
func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? {
let annotationView = MarkAnnotationView(annotation: annotation, reuseIdentifier: "MarkView")
annotationView.canShowCallout = true
return annotationView
}
func centerMapOnLocation(location:CLLocation, span:Double) {
let mapSpan = MKCoordinateSpanMake(0.2, 0.2)
let recenterRegion = MKCoordinateRegion(center: location.coordinate, span: mapSpan)
mapView.setRegion(recenterRegion, animated: true)
}
然后在ViewController中,当用户按下按钮时,在指定的lat/lon
处添加一个标记
func addMarkBtnPressed() {
// .... (have not shown : conversion of text fields from String to Double, adding Mark to marks array, etc ) ... All this works fine
addMarkAnnotation()
let mapCenter = CLLocation(latitude: markLat, longitude: markLon)
centerMapOnLocation(location: mapCenter, span: span)
}
试试下面的代码:
func centerMapOnLocation(location:CLLocation, span:Double) {
let mapSpan = mapView.region.span
let recenterRegion = MKCoordinateRegion(center: location.coordinate, span: mapSpan)
mapView.setRegion(recenterRegion, animated: true)
}
使用 mapView.addAnnotation 将注释添加到我的 mapView 时,mapView.setRegion
会正确设置动画并显示地图的中心和跨度。
但是当添加新注释然后调用 mapView.setRegion
时,视图再次从非常宽的地方开始,然后 animates/zooms 进入新的中心和跨度。
我想知道是否有办法从以前的区域平移到新区域(中心和跨度),而不是开始缩小,然后再次放大。
mapView.setRegion
每次都从这里开始缩放:
我定义了 2 个自定义 类:MarkAnnotation
& MarkAnnotationView
class MarkAnnotation : NSObject, MKAnnotation {
var coordinate: CLLocationCoordinate2D
var title: String?
var subtitle: String?
init(coordinate: CLLocationCoordinate2D, title: String, subtitle: String) {
self.coordinate = coordinate
self.title = title
self.subtitle = subtitle
}
}
class MarkAnnotationView: MKAnnotationView {
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
override init(annotation: MKAnnotation?, reuseIdentifier: String?) {
super.init(annotation: annotation, reuseIdentifier: reuseIdentifier)
guard let markAnnotation = self.annotation as? MarkAnnotation else { return }
image = UIImage(named: "customAnnotation")
}
}
在我的 MKMapViewDelegate
中:
func addMarkAnnotation() {
for mark in marks {
let markName : String = mark.name
let markLat : Double = mark.lat
let markLon : Double = mark.lon
let markLL = CLLocationCoordinate2DMake(markLat, markLon)
let markAnnotation = MarkAnnotation(coordinate:markLL, title:markNumStr, subtitle: markName)
mapView.addAnnotation(markAnnotation)
}
}
func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? {
let annotationView = MarkAnnotationView(annotation: annotation, reuseIdentifier: "MarkView")
annotationView.canShowCallout = true
return annotationView
}
func centerMapOnLocation(location:CLLocation, span:Double) {
let mapSpan = MKCoordinateSpanMake(0.2, 0.2)
let recenterRegion = MKCoordinateRegion(center: location.coordinate, span: mapSpan)
mapView.setRegion(recenterRegion, animated: true)
}
然后在ViewController中,当用户按下按钮时,在指定的lat/lon
处添加一个标记func addMarkBtnPressed() {
// .... (have not shown : conversion of text fields from String to Double, adding Mark to marks array, etc ) ... All this works fine
addMarkAnnotation()
let mapCenter = CLLocation(latitude: markLat, longitude: markLon)
centerMapOnLocation(location: mapCenter, span: span)
}
试试下面的代码:
func centerMapOnLocation(location:CLLocation, span:Double) {
let mapSpan = mapView.region.span
let recenterRegion = MKCoordinateRegion(center: location.coordinate, span: mapSpan)
mapView.setRegion(recenterRegion, animated: true)
}