iphone - 如何使用给定的用户位置初始化 MKMapView?

标签 iphone cocoa-touch mkmapview core-location

我的应用知道当前的用户位置(CoreLocation.framework)。
一旦用户打开一个新的 MapView,他的 iPhone 就会再次开始搜索当前位置。
是否可以跳过或更改 mkMapView 的第一个用户位置?

编辑:

是否可以覆盖 MKMapView 并使用其他 LocationManager?

最佳答案

是的,可以有一个单独的位置管理器对象并将其值分配给 map View (顺便说一句,我在下面使用“=”作为列表前缀以防止 SO 代码格式化程序出现故障)。

= 在您的 UIViewController维护两个独立的属性:一个到 MKMapView和一个到 CLLocationManager .

= 创建带有 MKMapView 的 XIB 文件以及您想要的任何其他窗口镶边。将 socket 连接到 Controller 属性。确保 MKMapView不跟随用户位置。

= 让 UIViewController 实现 CLLocationManagerDelegate协议(protocol)——尤其是 locationManager:didUpdateToLocation:fromLocation:只要有新的位置值可用,就会调用该方法。我们将 Controller 设置为位置管理器的委托(delegate)。

= 在 vi​​ewController 的 loadView方法,使用 MKMapView 加载 NIB在里面。为了给用户反馈,您可能需要提出 UIActivityIndicatorView微调器并将其设置为 startAnimating .然后你开始:

self.locationManager = [[CLLocationManager alloc] init];
self.locationManager.delegate = self;
self.locationManager.desiredAccuracy = kCLLocationAccuracyKilometer;
self.locationManager.distanceFilter = 10; // or whatever
[self.locationManager startUpdatingLocation];

= 在 locationManager:didUpdateToLocation:fromLocation:检查事件是否在最后 N 秒后更新。然后告诉位置管理器停止更新,让微调器停止动画,并获取纬度/经度数据并将其与 View 跨度和区域一起分配给 map View ,以便它缩放并居中到正确的位置。

= 现在是棘手的部分:蓝色大理石“颤抖者”是 map View 跟踪用户位置的一个特征。您将不得不暂时“伪造”它,直到真正的开始(或仅对当前位置使用单独的标记并自己保持其位置)。我个人会选择用户熟悉的蓝色大理石。

= 要让它在启动时正确显示,您需要创建一个自定义 MKAnnotationView,只在位置管理器返回的位置添加蓝色大理石图形。这意味着拍摄 map View 的快照并显示位置,然后仅将蓝色大理石用photoshop 处理出来并将其用作自定义注释 View 的图像。

= 如果您希望它主动跟随 map ,您可以启用 map View 的用户位置跟踪,当它获取实际数据时,您隐藏之前设置的标记并让 map View 进行更新。另一种选择是允许现有的位置管理器每秒左右继续接收更新,并自己更新蓝色大理石注释的位置。

= 让 mapview 自己的 userLocation 更新添加到 viewDidLoad:
[self.map.userLocation addObserver:self 
forKeyPath:@"location" 
options:(NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld) 
context:NULL];
self.map.showsUserLocation = YES; // starts updating user location

= 实现 observeValueForKeyPath .它在 location 时被调用mapview 的 userlocation 的属性有一个值:
-(void)observeValueForKeyPath:(NSString *)keyPath 
      ofObject:(id)object 
        change:(NSDictionary *)change 
       context:(void *)context 
{
     if ([self.map isUserLocationVisible]) {
         [self.locationManager stopUpdatingLocation];
         self.ownBlueMarble.hidden = YES;
     }
     // The current location is in self.map.userLocation.coordinate
}

= 为了避免显示当前位置时的预热延迟,请保留对包含 map 和位置管理器的 viewController 的引用,这样它就不会消失(这有点占用内存,但如果你释放它,你将拥有再次等待,直到 MapView 加载图 block 并准备就绪)。

= 在 viewWillLoad您可以将最后一个已知位置填充到自定义 bluemarble 注释中并显示它。打开/关闭 userLocation 跟踪,当您收到通知时,相同的 hide-the-annotation-show-the-real-marble 技巧将起作用。 map View 自己的位置管理器启动,当它有数据时,你可以让你的注释标记消失。

= 你可能想要实现 viewController 的 viewWillDisappear方法并手动关闭userLocation在 map View 上进行跟踪,因此在下次打开 View 时默认关闭。您还需要获取最后一个已知的 userLocation并将其保存以备下次使用。这样,您可以在 viewWillAppear 中进行所有定位标记杂耍。方法,并且在您准备好之前不必担心 userLocation 会干扰。

祝你好运。

关于iphone - 如何使用给定的用户位置初始化 MKMapView?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1437568/

相关文章:

iphone - 更改 TableView 上 UISearchBar 的宽度

iphone - 如何确保不显示没有行的部分

iphone - 如何在 UIView 下绘制阴影?

iPhone:以编程方式按下按钮

iphone - 如何在 viewForOverlay : 中区分两条 MKPolyline

iphone - 注释在 iOS 9 中变为默认状态

iphone - applicationWillResignActive x 屏幕保护程序

iphone - 在 Objective-C 中从模型生成表单(a django ModelForms)

ios - 如何在Swift 3.0中使用coreLocation框架创建20多个地理围栏

iphone - 存储 cookie 以保留 iPhone 应用程序的凭据