使用 MKMapView 的 showShowsUserLocation 方法而不显示视图

Posted

技术标签:

【中文标题】使用 MKMapView 的 showShowsUserLocation 方法而不显示视图【英文标题】:Use MKMapView's showShowsUserLocation method without displaying the view 【发布时间】:2015-03-27 07:27:37 【问题描述】:

您可能知道,在中国使用 CLLocationManager 进行定位是不准确的。但是,Apple 在 MKMapView 中包含了一个移位功能,因此从中获取的坐标是正确的。

现在我想使用纯粹的 MKMapView 的定位功能来获取当前位置。以下是我的代码:

在我的 LocationManager 的初始化函数中:

self.mapView = [[MKMapView alloc] initWithFrame:CGRectMake(0, 0, 1, 1)];
self.mapView.delegate = self;
self.mapView.showsUserLocation = YES;

在mapView的委托方法中:

- (void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation 
    NSLog(@"%@", userLocation.location);

现在问题来了。如果我不将 mapView 添加到 rootViewControler 的视图中,则不会发生任何事情,并且 mapView 将不会执行定位,即我必须调用以下代码:

[self.view addSubview:[FTLocationManager sharedManager].mapView];

在我的根视图控制器的 [viewDidLoad:] 方法中让 mapView 工作。

我尝试以编程方式创建 UIViewController 并将 mapView 添加到其视图中,但仍然没有任何反应。

我猜 MKMapView 只有在屏幕上显示时才会开始定位当前用户。

有没有办法触发 MKMapView 开始定位当前位置而不显示在屏幕上?

【问题讨论】:

你检查我的答案了吗? 【参考方案1】:

如果您不想在屏幕上显示,您可以将 mapView 添加到某个视图。查看我的代码:

- (void)viewDidLoad

    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    UIView *aView = [[UIView alloc] initWithFrame:self.view.bounds];

    self.mapView = [[MKMapView alloc] initWithFrame:aView.bounds];
    self.mapView.delegate = self;
    self.mapView.showsUserLocation = YES;
    [aView addSubview:_mapView];


上面的代码会添加mapView,但是如果你在模拟器上测试,代理方法didUpdateUserLocation:不会被调用,因为没有模拟用户位置。

为此,附加一个断点并模拟某个位置以触发对委托函数的调用。

希望这会有所帮助。谢谢。

【讨论】:

我知道这个方法。但它需要呈现这个视图控制器。我在我的 iPhone 上进行了测试。只要呈现视图控制器,mapView 就会开始定位。我想要的是完全在屏幕外运行 KMMapView,并且不要将其添加到任何视图中。 @HanXu 视图aView 从未添加到主视图中。所以它完全在屏幕外,对你来说是安全的。此外,您必须将地图添加到某些视图才能触发其方法。

以上是关于使用 MKMapView 的 showShowsUserLocation 方法而不显示视图的主要内容,如果未能解决你的问题,请参考以下文章

在不移动 MKMapView 的情况下使用 UIScreenEdgePanGestureRecognizer

如果我不再使用它,为啥在释放 MKMapView 后我会崩溃?

在 MKMapView 中释放缓存

使用 UIView 作为 MKMapView 子视图来绘制路线

使用 MKMapView 的 showShowsUserLocation 方法而不显示视图

使用缩放后 MKMapView 应用程序崩溃