MKMapView缩放到viewDidLoad上的用户位置?

buz*_*kip 37 iphone cocoa-touch objective-c

我试图在视图加载后将地图缩放到用户的当前位置,但是我收到错误"***由于未捕获的异常终止应用程序'NSInvalidArgumentException',原因:'无效区域' "当视图加载时.请有人帮忙吗?

干杯!

- (void)viewDidLoad
{
    [super viewDidLoad];

    MKCoordinateRegion mapRegion;   
    mapRegion.center.latitude = map.userLocation.coordinate.latitude;
    mapRegion.center.longitude = map.userLocation.coordinate.longitude;
    mapRegion.span.latitudeDelta = 0.2;
    mapRegion.span.longitudeDelta = 0.2;
    [map setRegion:mapRegion animated: YES];   
}
Run Code Online (Sandbox Code Playgroud)

Dee*_*olu 102

你定了showsUserLocation = YES吗?MKMapView如果设置为,则不会更新位置NO.所以要确保这一点.

MKMapView对象很可能还没有用户位置.要做得对,你应该采用MKMapViewDelegate协议和实现mapView:didUpdateUserLocation:

map.delegate = self;

...
-(void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation 
{
    MKCoordinateRegion mapRegion;   
    mapRegion.center = mapView.userLocation.coordinate;
    mapRegion.span.latitudeDelta = 0.2;
    mapRegion.span.longitudeDelta = 0.2;

    [mapView setRegion:mapRegion animated: YES];
}
Run Code Online (Sandbox Code Playgroud)


Abi*_*ern 19

与Deepak的答案一样,除了你可以更优雅地设置跨度:

- (void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation {
    MKCoordinateRegion mapRegion;   
    mapRegion.center = map.userLocation.coordinate;
    mapRegion.span = MKCoordinateSpanMake(0.2, 0.2);
    [map setRegion:mapRegion animated: YES];
}
Run Code Online (Sandbox Code Playgroud)


Jes*_*son 7

如果用户希望滚动地图,您不希望在userDidUpdateLocation内更新此内容.如果您将该代码放在上述方法中,则用户将无法滚动地图,因为将调用该函数并将地图居中回到当前位置.


Zoe*_*oef 6

到目前为止,最简单的方法是在didUpdateUserLocation中使用mapView.showAnnotations:

func mapView(mapView: MKMapView!, didUpdateUserLocation userLocation: MKUserLocation!) {
    mapView.showAnnotations([userLocation], animated: true)
}
Run Code Online (Sandbox Code Playgroud)

就这样!

MKUserLocation符合MKAnnotation协议.将userLocation作为一个数组传递,showAnnotations方法将让mapView放大一个区域加上跨越MKAnnotations数组的填充,在这种情况下它只是userLocation.适合我.

如果您只想放大一次,请使用initialUserLocation属性检查是否已设置初始属性.我不喜欢使用dispatch_once来做这类事情