用户位置上的iOS MKMapView中心,然后允许无限制滚动Swift 3.0

时间:2017-09-12 15:02:51

标签: ios swift mkmapview

我不相信Swift 3.0中已经提出过这个问题 - 三个目标:

  1. viewDidLoad地图中心到达可以设置的特定缩放级别的用户位置(例如let span: MKCoordinateSpan = MKCoordinateSpanMake(40.0, 40.0)

  2. 一旦地图加载并以用户位置为中心,用户就可以移动地图并将地图滚动到任何其他位置,而地图不会自动回到原始用户位置

  3. 允许用户仅放大到某个级别,但允许用户完全缩小以查看整个全局地图(缩小级别没有限制)

  4. 到目前为止,这是我的代码:

    import UIKit
    import MapKit
    import CoreLocation
    
    class ViewController: UIViewController, CLLocationManagerDelegate {
    
        @IBOutlet weak var mapView: MKMapView!
    
        let locationManager = CLLocationManager()
    
        func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
            let location = locations[0]
    
            let span: MKCoordinateSpan = MKCoordinateSpanMake(40.0, 40.0)
            let userLocation: CLLocationCoordinate2D = CLLocationCoordinate2DMake(location.coordinate.latitude, location.coordinate.longitude)
            let region: MKCoordinateRegion = MKCoordinateRegionMake(userLocation, span)
    
            mapView.setRegion(region, animated: true)
    
            self.mapView.showsUserLocation = true   
        }
    
    
        override func viewDidLoad() {
            super.viewDidLoad()
            // Do any additional setup after loading the view, typically from a nib.
            locationManager.delegate = self
            locationManager.desiredAccuracy = kCLLocationAccuracyBest
            locationManager.requestWhenInUseAuthorization()
            locationManager.startUpdatingLocation()
        }
    
    }
    

1 个答案:

答案 0 :(得分:4)

1。应该使用你现在拥有的代码。

2。添加检查后续位置更新

didUpdateLocations方法中,添加Bool以检查区域是否已经在用户中心。

var regionHasBeenCentered = false

func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
    let location = locations[0]

    if !regionHasBeenCentered {
        let span: MKCoordinateSpan = MKCoordinateSpanMake(40.0, 40.0)
        let userLocation: CLLocationCoordinate2D = CLLocationCoordinate2DMake(location.coordinate.latitude, location.coordinate.longitude)
        let region: MKCoordinateRegion = MKCoordinateRegionMake(userLocation, span)

        mapView.setRegion(region, animated: true)
        regionHasBeenCentered = true
    }

    self.mapView.showsUserLocation = true   
}

现在,在第一次更新后,地图将不再以用户为中心,直到您将regionHasBeenCentered更改回false。这将允许用户自由滚动和缩放。

3。实施MKMapViewDelegate方法以检测地图区域更改

在视图控制器上实施MKMapViewDelegate,以便检查区域更改。

class ViewController: UIViewController, CLLocationManagerDelegate, MKMapViewDelegate {

...并将视图控制器设置为delegate

override func viewDidLoad() {
    // other things…

    mapView.delegate = self
}

然后实现以下方法,该方法将在区域更改之前调用。在这里,您可以检查跨度的尺寸是否太小,并将它们设置为最小值。

func mapView(_ mapView: MKMapView, regionWillChangeAnimated animated: Bool) {
    if mapView.region.span.latitudeDelta <= 40 && mapView.region.span.longitudeDelta <= 40 {
         let minimumSpan = MKCoordinateSpan(latitudeDelta: 40, longitudeDelta: 40)
         let minimumRegion= MKCoordinateRegion(center: mapView.centerCoordinate, span: minimumSpan)
         mapView.setRegion(minimumRegion, animated: false)
    }
}

重要说明:从MKCoordinateSpan documentation开始,longitudeDelta会在您向赤道移动时移动。

  

<强> longitudeDelta

     

要为地图区域显示的东西距离(以度为单位)的数量。经度范围跨越的公里数根据当前纬度而变化。例如,一度经度在赤道处大约111公里(69英里)的距离,但在两极处缩小到0公里。

此外,MKCoordinateSpan的尺寸以度为单位,40度相当大,所以您可能想要更改这些值,否则用户根本无法放大