以编程方式放大MKMapView

问题描述:

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

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

然而,这个代码是没有效果的,因为我没有更新longitudeDelta值。所以我添加了这一行:

zoomIn.span.longitudeDelta *= 0.5; 

现在,它的工作,但只是有时。 latitudeDeltalongitudeDelta不会以相同的方式改变,我的意思是,它们的值不成比例。任何想法如何解决这个问题?

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

你也可以看看regionThatFits方法,它会调整你提供的区域(名字来自内存,因为我没有苹果文档)。

我不知道如果这是正确的做法,但我用它来放大和缩小。

 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]; 
    } 
+0

它帮助我藏汉,感谢兄弟 – user366584 2011-12-25 10:12:04

+0

这工作得很好,但是当我连续按缩小按钮它给我的异常后,一定程度上。 我该如何预防? – 2015-04-15 14:23:24

+0

很酷。除以2.0002而不是2的点是什么?只是好奇:) – dustinrwh 2015-12-04 14:55:17

这里有一个简单的解决方案:

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

刚刚清理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) 
} 

这里是我的方式将地图移动到注释点并缩放非常接近它。您可以轻松地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]; 
} 

- (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]; 
    } 
} 

只是翻译dkardel的解决方案改变变焦在网上迅速:

@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) 
} 

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)