我正在使用MKMapview,我在缩放级别和区域范围方面遇到了问题。
当刷新MKMapView时,它会将区域重置为我最初安装时已经硬编码的值。我正在跟踪用户的位置,并且对于电话位置的任何更改,地图应通过CLLocationManagerDelegate和下面列出的委托方法进行更新。
目前我在locationManager中有这个:didUpdateToLocation:fromLocation:
MKCoordinateSpan span;
span.latitudeDelta = 0.8;
span.longitudeDelta = 0.8;
MKCoordinateRegion region;
region.center = newLocation.coordinate;
region.span = span;
[self.MyMapView setRegion:region animated:NO];
我也尝试在viewDidLoad中添加类似的代码:无济于事。我的想法是我可以以某种方式在
中动态设置区域-(void)mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated
委托方法我可以完全回避这个问题,但我不是确切地确定我应该怎么做。
最终,我只想让地图停止“捕捉”回上面的跨度。提前谢谢。
答案 0 :(得分:0)
如果您尝试将地图置于用户当前位置的中心位置,请先决定是否要使用:
userLocation
属性和地图视图的委托方法mapView:didUpdateUserLocation:
或CLLocationManager
及其委托方法locationManager:didUpdateToLocation:fromLocation:
使用viewDidLoad
中的任何一个,您只需设置地图视图的初始区域,包括中心(使用一些默认坐标)和跨度。在viewDidLoad中,用户的位置不太可能立即可用,因为它可能需要几秒钟才能获得。
在设置具有该值的区域时,尝试在其设置之前使用userLocation
可能会导致异常。
如果使用地图视图的userLocation
,则:
mapView.showsUserLocation
设置为YES
mapView:didUpdateUserLocation:
方法中,执行mapView.centerCoordinate = userLocation.location.coordinate;
(或使用setCenterCoordinate:animated:
)mapView:didFailToLocateUserWithError:
以处理或至少了解失败如果使用CLLocationManager
,则:
[locationManager startUpdatingLocation];
locationManager:didUpdateToLocation:fromLocation:
方法中,执行mapView.centerCoordinate = newLocation.coordinate;
(或使用动画方法)locationManager:didFailWithError:
以处理或至少了解失败答案 1 :(得分:0)
我能够通过创建一个UIViewController
子类来保存MKMapView
实例来解决这个问题。我在loadView
中恢复mapView的范围,然后在VC的[mapView setUserTrackingMode:...]
方法中调用viewWillAppear
。
我看到了OP在前面的实现中描述的行为,我在那里动态创建了一个VC和一个“MKMapView”实例,然后将其推送到我的导航控制器上。我无法同时设置范围并设置用户跟踪以跟随用户而不会丢失跨度。我做了一些调试甚至看到原始跨度值在显示视图时被丢弃,所以我认为它与设置跨度或设置用户跟踪模式有关,而没有显示视图。无论如何,组织上面的代码解决了这个问题。
以下是相关位:
// ===== mainVC.h =====
#import <UIKit/UIKit.h>
#import <MapKit/MapKit.h>
@interface MapVC : UIViewController <MKMapViewDelegate>
@end
// ===== mainVC.m =====
static MapVC *map = nil;
- (void)mapAction {
UINavigationController *nav = [self navigationController];
// map VC is a singleton
if (!map) map = [[MapVC alloc] init];
[nav pushViewController:map animated:TRUE];
}
// ===== MapVC.m =====
- (void)loadView {
mapView = [[MKMapView alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
[mapView setDelegate:self];
MKCoordinateSpan span = MKCoordinatSpanMake(storedLatitudeDelta, storedLongitudeDelta);
[mapView setRegion:MKCoordinateRegionMake(storedCenter, span)];
[self setView:mapView];
}
- (void)viewWillAppear:(BOOL)animated {
[mapView setUserTrackingMode:MKUserTrackingModeFollow animated:TRUE];
}
- (void)mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated {
MKCoordinateSpan mySpan = [mapView region].span;
storedLatitudeDelta = mySpan.latitudeDelta;
storedLongitudeDelta = mySpan.longitudeDelta;
}
我从一个更大的项目中删除了,所以如果你看到任何错别字,请告诉我,但这就是它的要点。