Using IBAction Buttons to Zoom MapView

前端 未结 6 1547
谎友^
谎友^ 2021-01-02 17:17

I have an issue. My current location is displayed and centered in a map view however the map region doesn\'t get zoomed in to. I tried taking Rob\'s advice by taking span an

相关标签:
6条回答
  • 2021-01-02 17:47

    You can get the current region, multiply or divide the span by two, as appropriate (dividing on zoom in, multiplying on zoom out), and then set the region:

    - (IBAction)zoomIn:(id)sender {
        MKCoordinateRegion region = self.mapView.region;
        region.span.latitudeDelta /= 2.0;
        region.span.longitudeDelta /= 2.0;
        [self.mapView setRegion:region animated:YES];
    }
    
    - (IBAction)zoomOut:(id)sender {
        MKCoordinateRegion region = self.mapView.region;
        region.span.latitudeDelta  = MIN(region.span.latitudeDelta  * 2.0, 180.0);
        region.span.longitudeDelta = MIN(region.span.longitudeDelta * 2.0, 180.0);
        [self.mapView setRegion:region animated:YES];
    }
    

    If you want to have the map automatically zoom to your location, you can use:

    self.mapView.userTrackingMode = MKUserTrackingModeFollow;
    

    If you want to do this manually, you can do something like the following. First, define an class property for whether you've zoomed in already or not:

    @property (nonatomic) BOOL alreadySetZoomScale;
    

    then change your didUpdateLocations (or didUpdateToLocation) to check this and set the zoom scale once:

    - (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations
    {
        CLLocation* newLocation = [locations lastObject]; // if less than zero, then valid lat and long not found
    
        if (newLocation.horizontalAccuracy < 0)
            return;
    
        if (!self.alreadySetZoomScale)
        {
            MKCoordinateRegion region = MKCoordinateRegionMakeWithDistance(newLocation.coordinate, 1609, 1609); // 1 mile = 1609.34 meters
            self.mapView.region = region;
            [self.mapView setRegion:region animated:YES];
            self.alreadySetZoomScale = YES;
        }
        else
        {
            [self.mapView setCenterCoordinate:newLocation.coordinate animated:YES];
        }
    }
    
    - (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation
    {
        // if prior to iOS 6, use this old `MKMapViewDelegate` method, but call our
        // other routine.
    
        if (SYSTEM_VERSION_LESS_THAN(@"6.0"))
            [self locationManager:manager didUpdateLocations:@[newLocation]];
    }
    

    This basically says, "if I haven't zoomed in yet, set the region based upon the newLocation and a certain number of meters around that location, but if I have already done that, the just set the center coordinate based upon my current location, but don't change the zoom scale (in case I already zoomed in or out). This also does some conditional iOS version number logic (using the macros shown here), making sure if the end-user is running iOS prior to 6.0, that it will call our updated method.

    By the way, if you're showing the user location on the map (e.g. self.mapView.showsUserLocation = YES;), you might want to have this didUpdateLocations also remove the overlay associated with the MKUserLocation before moving the map center, otherwise it can leave the old overlay sitting around:

    [self.mapView removeOverlays:self.mapView.overlays];
    
    0 讨论(0)
  • 2021-01-02 17:51

    OK, this is what I ended using to get my 2 IBAction buttons (zoomIn and zoomOut) to work with my mapView. When you open the app, the user location is displayed and the map zooms in and centers around it. You can then use the buttons to zoom in or zoom out by a factor of 2. *Big thanks to Rob who showed me the way.

    .h

    - (IBAction)zoomIn:(id)sender;
    
    - (IBAction)zoomOut:(id)sender;
    

    .m

    @interface LocationViewController ()
    
    @property (nonatomic) BOOL alreadySetZoomScale;
    
    @end
    
    
    
    -(void)locationManager:(CLLocationManager *)manager
    didUpdateToLocation:(CLLocation *)newLocation
          fromLocation:(CLLocation *)oldLocation {
    
    
    if (!_alreadySetZoomScale)
    {
    MKCoordinateRegion region = MKCoordinateRegionMakeWithDistance(newLocation.coordinate,    1609, 1609); // 1 mile = 1609.34 meters
    
    self.mapView.region = region;
    [self.mapView setRegion:region animated:YES];
    _alreadySetZoomScale = YES;
    
    }
    
    else
    
    {
    [self.mapView setCenterCoordinate:newLocation.coordinate animated:YES];
    }
    
    
    - (IBAction)zoomIn:(id)sender {
    
    MKCoordinateRegion region = self.mapView.region;
    region.span.latitudeDelta /= 2.0;
    region.span.longitudeDelta /= 2.0;
    self.mapView.region = region;
    
    }
    
    - (IBAction)zoomOut:(id)sender {;
    
    MKCoordinateRegion region = self.mapView.region;
    region.span.latitudeDelta *= 2.0;
    region.span.longitudeDelta *= 2.0;
    self.mapView.region = region;
    
    }
    

    I have a couple other calls to MKMapView like self.mapView.showsUserLocation = YES; in viewDidLoad but that's pretty much it.

    0 讨论(0)
  • 2021-01-02 17:51

    You could achieve the most basic in 3 lines of code

    var region: MKCoordinateRegion = self.mapView.region
    region = MKCoordinateRegionMake(self.mapView.centerCoordinate, MKCoordinateSpanMake(0.005, 0.005));
    self.mapView.setRegion(region, animated: true)
    
    0 讨论(0)
  • 2021-01-02 18:03

    Try this. But I haven't tested yet.

    - (IBAction)zoomIn:(id)sender {
          MKCoordinateSpan span;
          span.latitudeDelta = _mapView.region.span.latitudeDelta * 2;
          span.longitudeDelta = _mapView.region.span.latitudeDelta * 2;
          MKCoordinateRegion region;
          region.span = span;
          region.center = _mapView.region.center;
    
         [self.mapView setRegion:region animated:YES];
     }
    
     - (IBAction)zoomOut:(id)sender {
          MKCoordinateSpan span;
          span.latitudeDelta = _mapView.region.span.latitudeDelta / 2;
          span.longitudeDelta = _mapView.region.span.latitudeDelta / 2;
          MKCoordinateRegion region;
          region.span = span;
          region.center = _mapView.region.center;
    
         [self.mapView setRegion:region animated:YES];
    
     }
    
    0 讨论(0)
  • 2021-01-02 18:09

    Swift 3:

    import GoogleMaps
    import GooglePlaces
    import CoreLocation
    import UIKit
    
    class LocationMapView: UIViewController, GMSMapViewDelegate, CLLocationManagerDelegate {
    
         @IBOutlet weak var mapView: GMSMapView!
    
         var mapViewZoomStepperValue: Float = 0.0
         @IBOutlet weak var mapViewZoomStepper: UIStepper!
    
         override func viewDidLoad() {
                super.viewDidLoad()
    
                mapViewZoomStepper.minimumValue = -100
    
            }
    
            @IBAction func mapViewZoomStepperValueChanged(_ sender: Any) {
    
                if (Float(mapViewZoomStepper.value) > mapViewZoomStepperValue){
    
                    mapViewZoomStepperValue = Float(mapViewZoomStepper.value)
                    zoomIn()
    
                }else{
    
                    mapViewZoomStepperValue = Float(mapViewZoomStepper.value)
                    zoomOut()
    
                }
    
            }
    
            func zoomIn() {
    
                print("Zoom in!!")
                if mapView.camera.zoom == mapView.maxZoom {
                    return
                }
    
                let currentZoom = mapView.camera.zoom + 1
                mapViewZoomController(currentZoom)
    
            }
    
            func zoomOut() {
    
                print("Zoom out!!")
                if mapView.camera.zoom == mapView.minZoom {
                    return
                }
    
                let currentZoom = mapView.camera.zoom - 1
                mapViewZoomController(currentZoom)
    
            }
    
            func mapViewZoomController(_ level: Float) {
    
                let point: CGPoint = mapView.center
                let coor: CLLocationCoordinate2D = mapView.projection.coordinate(for: point)
                let camera = GMSCameraPosition.camera(withLatitude: coor.latitude, longitude: coor.longitude, zoom: Float(level))
                mapView.animate(to: camera)
    
            }
    
    }
    
    0 讨论(0)
  • 2021-01-02 18:10

    Swift 2.0:

    Using Extension :

    extension MKMapView{
    
     func zoomInPinAnnotationLocation(targetMapViewName : MKMapView?, delta: Double)
     {
      var region: MKCoordinateRegion = targetMapViewName!.region
      region.span.latitudeDelta /= delta
      region.span.longitudeDelta /= delta
      targetMapViewName!.region = region
    
     }
     func zoomOutPinAnnotationLocation(targetMapViewName : MKMapView?,delta: Double)
     {
      var region: MKCoordinateRegion = targetMapViewName!.region
      region.span.latitudeDelta *= delta
      region.span.longitudeDelta *= delta
      targetMapViewName!.region = region
     }
    
    }
    

    Usage:

    var mapViewZoomStepperValue: Double = -1.0
    @IBOutlet weak var mapViewZoomStepper: UIStepper!
    
    @IBAction func mapViewZoomStepperValueChanged(sender: AnyObject) {
    
      if (mapViewZoomStepper.value  > mapViewZoomStepperValue)
      {
       mapViewZoomStepperValue = mapViewZoomStepperValue + 1.0
    
    //Zoom In
       detailMapView.zoomInPinAnnotationLocation(detailMapView, delta: 3.0)
      }
      else
      {
       mapViewZoomStepperValue = mapViewZoomStepper.value - 1.0
    
    //Zoom Out
       detailMapView.zoomOutPinAnnotationLocation(detailMapView, delta: 3.0)
      }
    
     }
    
    0 讨论(0)
提交回复
热议问题