以编程方式在MKMapView中放大地图

26

我在iPhone应用程序中使用MKMapView。当我点击一个按钮时,缩放级别必须增加。这是我的第一种方法:

MKCoordinateRegion zoomIn = mapView.region;
zoomIn.span.latitudeDelta *= 0.5;
[mapView setRegion:zoomIn animated:YES];

然而,这段代码没有产生任何效果,因为我没有更新longitudeDelta的值。所以我加入了这行代码:

zoomIn.span.longitudeDelta *= 0.5;

现在它能工作,但仅在某些情况下。我指的是latitudeDeltalongitudeDelta不以相同的方式变化,也就是说,它们的值不成比例。有什么解决办法吗?

10个回答

30

我不知道这是否是正确的方法,但我正在使用它来缩放。

        case 0: { // Zoom In
        //NSLog(@"Zoom - IN");
        MKCoordinateRegion region;
        //Set Zoom level using Span
        MKCoordinateSpan span;  
        region.center=mapView.region.center;

        span.latitudeDelta=mapView.region.span.latitudeDelta /2.0002;
        span.longitudeDelta=mapView.region.span.longitudeDelta /2.0002;
        region.span=span;
        [mapView setRegion:region animated:TRUE];
    }
        break;

    // Zoom Out 
    case 2: {
        //NSLog(@"Zoom - OUT");
        MKCoordinateRegion region;
        //Set Zoom level using Span
        MKCoordinateSpan span;  
        region.center=mapView.region.center;
        span.latitudeDelta=mapView.region.span.latitudeDelta *2;
        span.longitudeDelta=mapView.region.span.longitudeDelta *2;
        region.span=span;
        [mapView setRegion:region animated:TRUE];
    }

这个程序运行良好,但是当我连续按缩小按钮时,在某个级别后它会抛出异常。我该如何防止这种情况发生? - Vivek Shah
很酷。除以 2.0002 而不是 2 的目的是什么?只是好奇 :) - dustinrwh
2
嗨 Zoom-Out,当我连续按下时,代码崩溃了,你能告诉我如何修复吗?以下是崩溃日志: Terminating app due to uncaught exception 'NSInvalidArgumentException',reason: 'Invalid Region <center:+13.06748979, +80.24493745 span:+245.43019431, +223.01760747>'。 - Sanju

28

仅对dkdarel的回答进行清理

// delta is the zoom factor
// 2 will zoom out x2
// .5 will zoom in by x2
- (void)zoomMap:(MKMapView*)mapView byDelta:(float) delta {

    MKCoordinateRegion region = mapView.region;
    MKCoordinateSpan span = mapView.region.span;
    span.latitudeDelta*=delta;
    span.longitudeDelta*=delta;
    region.span=span;
    [mapView setRegion:region animated:YES];

}

Swift 代码:

func zoomMap(byFactor delta: Double) {
    var region: MKCoordinateRegion = self.mapView.region
    var span: MKCoordinateSpan = mapView.region.span
    span.latitudeDelta *= delta
    span.longitudeDelta *= delta
    region.span = span
    mapView.setRegion(region, animated: true)
}

我认为这段代码是正确的 Swift 代码。func zoomRegion(region: inout MKCoordinateRegion, byFactor delta: Double) { var span: MKCoordinateSpan = region.span span.latitudeDelta *= delta span.longitudeDelta *= delta region.span = span } - Simon Moshenko

24

以下是更简单的解决方案:

MKUserLocation *userLocation = mapView.userLocation;
MKCoordinateRegion region = MKCoordinateRegionMakeWithDistance (
      userLocation.location.coordinate, 50, 50);
[mapView setRegion:region animated:NO];

4

mapView.setRegion 方法在地图被旋转时存在问题。

您可以通过 mapView.camera.altitude 属性缩放地图,但它不支持动画效果:

mapView.camera.altitude *= 1.05

您可以创建新的相机对象并对其进行动画设置:
let currentCamera = mapView.camera
let newCamera: MKMapCamera
if #available(iOS 9.0, *) {
    newCamera = MKMapCamera(lookingAtCenter: currentCamera.centerCoordinate, fromDistance: currentCamera.altitude * 2, pitch: currentCamera.pitch, heading: currentCamera.heading)
} else {
    newCamera = MKMapCamera()
    newCamera.centerCoordinate = currentCamera.centerCoordinate
    newCamera.heading = currentCamera.heading
    newCamera.altitude = currentCamera.altitude * 2
    newCamera.pitch = currentCamera.pitch
}

mapView.setCamera(newCamera, animated: true)

2

刚刚将dkardel的解决方案翻译成了Swift:

@IBAction func zoomOutButtonClicked(sender: UIButton) {
    let span = MKCoordinateSpan(latitudeDelta: mapView.region.span.latitudeDelta*2, longitudeDelta: mapView.region.span.longitudeDelta*2)
    let region = MKCoordinateRegion(center: mapView.region.center, span: span)

    mapView.setRegion(region, animated: true)
}

@IBAction func zoomInButtonClicked(sender: UIButton) {
    let span = MKCoordinateSpan(latitudeDelta: mapView.region.span.latitudeDelta/2, longitudeDelta: mapView.region.span.longitudeDelta/2)
    let region = MKCoordinateRegion(center: mapView.region.center, span: span)

    mapView.setRegion(region, animated: true)
}

2

在Swift 4.2中


let location = mapView.userLocation
let region = MKCoordinateRegion(center: location.coordinate, span: MKCoordinateSpan(latitudeDelta: 50, longitudeDelta: 50))
mapView.setRegion(region, animated: true)

2

这是我移动地图到注释点并缩放到非常接近的方法。您可以在行CGFloat newLatDelta = 0.06f;中轻松更改缩放程度。

- (void)moveMapToAnnotation:(MKPointAnnotation*)annotation
{
    CGFloat fractionLatLon = map.region.span.latitudeDelta / map.region.span.longitudeDelta;
    CGFloat newLatDelta = 0.06f;
    CGFloat newLonDelta = newLatDelta * fractionLatLon;
    MKCoordinateRegion region = MKCoordinateRegionMake(annotation.coordinate, MKCoordinateSpanMake(newLatDelta, newLonDelta));
    [map setRegion:region animated:YES];
}

这正是我正在寻找的.. 谢谢兄弟 - Tapas Pal

1

我使用类似于你的代码,它似乎可以工作。可能发生的情况是您的增量不足以导致从一个谷歌缩放级别到下一个缩放级别的缩放级别增加。这也取决于地图的初始状态,这可能解释了为什么它是间歇性的 - 那么在用户按下缩放按钮之前,您如何设置地图和缩放级别?

您还可以查看regionThatFits方法,该方法将调整您提供的区域(名称来自记忆,因为我没有苹果文档方便)。


1
- (IBAction)btnZoomInPressed
{
    MKCoordinateRegion region;
    MKCoordinateSpan span;
    region.center.latitude = lati;
    region.center.longitude = longi;
    span.latitudeDelta=viewMapSingleVenue.region.span.latitudeDelta /2.0002;
    span.longitudeDelta=viewMapSingleVenue.region.span.longitudeDelta /2.0002;
    region.span=span;
    [viewMapSingleVenue setRegion:region animated:TRUE];
}

- (IBAction)btnZoomOutPressed
{
    MKCoordinateRegion region;
    MKCoordinateSpan span;
    region.center.latitude = lati;
    region.center.longitude = longi;
    span.latitudeDelta=viewMapSingleVenue.region.span.latitudeDelta *2;
    span.longitudeDelta=viewMapSingleVenue.region.span.longitudeDelta *2;
    if(span.latitudeDelta < 200)
    {
    region.span=span;
    [viewMapSingleVenue setRegion:region animated:TRUE];
    }
}

0

要缩小5%,请将区域纬度/经度增量乘以1.05

let region = MKCoordinateRegion(center: mapView.centerCoordinate, span: MKCoordinateSpan(latitudeDelta: mapView.region.span.latitudeDelta*1.05, longitudeDelta: mapView.region.span.longitudeDelta*1.05))
self.mapView.setRegion(region, animated: true)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接