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)
| 归档时间: |
|
| 查看次数: |
4719 次 |
| 最近记录: |