使用 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 后我会崩溃?
使用 UIView 作为 MKMapView 子视图来绘制路线