使用IBAction按钮缩放MapView

JBe*_*sky 7 zoom mkmapview ibaction ios ios6

我有一个问题.我的当前位置以地图视图显示并居中,但地图区域不会放大.我尝试通过从didUpdateToLocation方法中取出span和region来获取Rob的建议,但我必须没有正确实现它.我不认为它在viewDidLoad中识别我对setRegion的调用,并且我的按钮无法被识别.请检查下面的代码,并指出错误.我的目标是使用IBAction按钮放大和缩小我的位置.

.H

- (IBAction)zoomIn:(id)sender;

- (IBAction)zoomOut:(id)sender;
Run Code Online (Sandbox Code Playgroud)

.m在viewDidLoad中

double miles = 0.5;

MKCoordinateSpan span;
span.latitudeDelta = miles/69.0;
span.longitudeDelta = miles/69.0;

MKCoordinateRegion region;
region.span = span;

[self.mapView setRegion:region animated:YES];

[self.mapView setUserTrackingMode:MKUserTrackingModeFollow animated:YES];

_mapView.mapType = MKMapTypeSatellite;
Run Code Online (Sandbox Code Playgroud)

.m在我的didUpdateToLocation方法中.

[self.mapView setCenterCoordinate:newLocation.coordinate animated:YES];
Run Code Online (Sandbox Code Playgroud)

.放大:

- (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];
}
Run Code Online (Sandbox Code Playgroud)

.缩小 :

- (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];
}
Run Code Online (Sandbox Code Playgroud)

Rob*_*Rob 10

您可以根据需要获取当前region,乘以或除以span2(除以放大,乘以缩小),然后设置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];
}
Run Code Online (Sandbox Code Playgroud)

如果您想让地图自动缩放到您的位置,您可以使用:

self.mapView.userTrackingMode = MKUserTrackingModeFollow;
Run Code Online (Sandbox Code Playgroud)

如果要手动执行此操作,可以执行以下操作.首先,定义一个类属性,以确定是否已经放大:

@property (nonatomic) BOOL alreadySetZoomScale;
Run Code Online (Sandbox Code Playgroud)

然后更改您的didUpdateLocations(或didUpdateToLocation)以检查并设置一次缩放比例:

- (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]];
}
Run Code Online (Sandbox Code Playgroud)

这基本上说,"如果我还没有放大,请根据newLocation该位置周围的一定数量的米设置区域,但如果我已经这样做了,那么根据我当前的位置设置中心坐标,但是不要改变缩放比例(如果我已经放大或缩小).这也做了一些条件iOS版本号逻辑(使用此处显示),确保最终用户是否在6.0之前运行iOS,它将调用我们更新的方法.

顺便说一句,如果您在地图上显示用户位置(例如self.mapView.showsUserLocation = YES;),您可能希望在移动地图中心之前didUpdateLocations删除与之关联的叠加层MKUserLocation,否则它可以保留旧的叠加层:

[self.mapView removeOverlays:self.mapView.overlays];
Run Code Online (Sandbox Code Playgroud)