开发者

Continuous zooming with MKMapView?

开发者 https://www.devze.com 2023-03-14 15:18 出处:网络
I am working with a MKMapView thats visible area (zoom level) is set with a slider. I set the visible area with a MKCoordinateRegion and setRegion:animated:.

I am working with a MKMapView thats visible area (zoom level) is set with a slider. I set the visible area with a MKCoordinateRegion and setRegion:animated:.

The problem is that I don't seem to be able to get extremely precise control over the visible area. It's as if the latitude\longitude deltas snap to the default ~21 zoom levels provided by Google.

Wha开发者_高级运维t I really want is similar to the behavior of the Map.app when pinching to zoom. It scales the view until the threshold for a new zoom level is reached, and then it renders the new map level.

Is there a simple way to access\emulate this behavior? How does it work?

Code I'm using:

MKCoordinateRegion region;
MKCoordinateSpan span;
CLLocationCoordinate2D center = {45.475969,-73.64095};
region.center = center;
span.latitudeDelta = 0.01;
span.longitudeDelta = 0.01;
region.span = span;

[mapView setRegion:region animated:TRUE];

If I use a delta of 0.01 or 0.013, I get the exact same map.


The simple answer is that MapKit does not allow you to programatically set a zoom level other than the default 21 levels supplied by google. The region span you set will always "snap" to the closest one.


Are you using setRegion:animated: ? http://developer.apple.com/library/ios/#documentation/MapKit/Reference/MKMapView_Class/MKMapView/MKMapView.html#//apple_ref/occ/instm/MKMapView/setRegion:animated:


You can set mapview's visibleMapRect to achieve continuous zooming. Following code shows how to zoom in 1 level (it's a subclass of a MKMapView so self is an instance of MKMapView).

MKMapRect visibleRect = self.visibleMapRect;
MKMapSize size = visibleRect.size;
CGFloat aspectRatio = size.width / size.height;
CGPoint center = CGPointMake(visibleRect.origin.x + size.width/2, visibleRect.origin.y + size.height/2);
CGFloat zoomedHeight = size.height / 2;  // By divide by 2, will zoom in exact 1 level
CGFloat zoomedWidth = zoomedHeight * aspectRatio;
visibleRect = MKMapRectMake(center.x - zoomedWidth/2, center.y - zoomedHeight/2, zoomedWidth, zoomedHeight);
self.visibleMapRect = visibleRect;
0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号