Setting the zoom level for a MKMapView

后端 未结 15 2738
不知归路
不知归路 2020-12-02 05:46

I have a map which shows correctly, the only thing I want to do now is set the zoom level when it loads. Is there a way to do this?

Thanks

相关标签:
15条回答
  • 2020-12-02 05:51

    A simple Swift implementation, if you use outlets.

    @IBOutlet weak var mapView: MKMapView! {
        didSet {
            let noLocation = CLLocationCoordinate2D()
            let viewRegion = MKCoordinateRegionMakeWithDistance(noLocation, 500, 500)
            self.mapView.setRegion(viewRegion, animated: false)
        }
    }
    

    Based on @Carnal's answer.

    0 讨论(0)
  • 2020-12-02 05:51

    Swift implementation

    import Foundation
    import MapKit
    
    class MapViewWithZoom: MKMapView {
    
        var zoomLevel: Int {
            get {
                return Int(log2(360 * (Double(self.frame.size.width/256) / self.region.span.longitudeDelta)) + 1);
            }
    
            set (newZoomLevel){
                setCenterCoordinate(coordinate:self.centerCoordinate, zoomLevel: newZoomLevel, animated: false)
            }
        }
    
        private func setCenterCoordinate(coordinate: CLLocationCoordinate2D, zoomLevel: Int, animated: Bool) {
            let span = MKCoordinateSpan(latitudeDelta: 0, longitudeDelta: 360 / pow(2, Double(zoomLevel)) * Double(self.frame.size.width) / 256)
            setRegion(MKCoordinateRegion(center: coordinate, span: span), animated: animated)
        }
    }
    
    0 讨论(0)
  • 2020-12-02 05:56

    Here, I put my answer and its working for swift 4.2.

    MKMapView center and zoom in

    0 讨论(0)
  • 2020-12-02 05:58

    For Swift 3 it's pretty fast forward:

    private func setMapRegion(for location: CLLocationCoordinate2D, animated: Bool)
    {
        let viewRegion = MKCoordinateRegionMakeWithDistance(location, <#T##latitudinalMeters: CLLocationDistance##CLLocationDistance#>, <#T##longitudinalMeters: CLLocationDistance##CLLocationDistance#>)
        MapView.setRegion(viewRegion, animated: animated)
    }
    

    Just define the lat-, long-Meters <CLLocationDistance> and the mapView will fit the zoom level to your values.

    0 讨论(0)
  • 2020-12-02 06:00

    It's not built in, but I've seen / used this code. This allows you to use this:

    [mapView setCenterCoordinate:myCoord zoomLevel:13 animated:YES];
    

    Note: This is not my code, I did not write it, so therefore can't take credit for it

    0 讨论(0)
  • 2020-12-02 06:02

    A Swift 2.0 answer utilising NSUserDefaults to save and restore the map's zoom and position.

    Function to save the map position and zoom:

    func saveMapRegion() {
        let mapRegion = [
            "latitude" : mapView.region.center.latitude,
            "longitude" : mapView.region.center.longitude,
            "latitudeDelta" : mapView.region.span.latitudeDelta,
            "longitudeDelta" : mapView.region.span.longitudeDelta
        ]
        NSUserDefaults.standardUserDefaults().setObject(mapRegion, forKey: "mapRegion")
    }
    

    Run the function each time the map is moved:

    func mapView(mapView: MKMapView, regionDidChangeAnimated animated: Bool) 
    {
            saveMapRegion();
    }
    

    Function to save the map zoom and position:

    func restoreMapRegion() 
    {
        if let mapRegion = NSUserDefaults.standardUserDefaults().objectForKey("mapRegion") 
        {
    
            let longitude = mapRegion["longitude"] as! CLLocationDegrees
            let latitude = mapRegion["latitude"] as! CLLocationDegrees
            let center = CLLocationCoordinate2D(latitude: latitude, longitude: longitude)
    
            let longitudeDelta = mapRegion["latitudeDelta"] as! CLLocationDegrees
            let latitudeDelta = mapRegion["longitudeDelta"] as! CLLocationDegrees
            let span = MKCoordinateSpan(latitudeDelta: latitudeDelta, longitudeDelta: longitudeDelta)
    
            let savedRegion = MKCoordinateRegion(center: center, span: span)
    
            self.mapView.setRegion(savedRegion, animated: false)
        }
    }
    

    Add this to viewDidLoad:

    restoreMapRegion()
    
    0 讨论(0)
提交回复
热议问题