jan*_*mon 19 iphone cocoa-touch core-location mkmapview
我的应用程序知道当前用户位置(CoreLocation.framework).一旦用户打开新的MapView,他的iPhone就会再次开始搜索当前位置.是否可以跳过它或更改mkMapView的第一个用户位置?
编辑:
是否可以覆盖MKMapView并使用其他LocationManager?
Ram*_*min 42
是的,可以有一个单独的位置管理器对象,并将其值分配给mapview(顺便说一下,我在下面使用'='作为列表前缀,以防止SO代码格式化程序被borking).
=在UIViewController维护两个单独的属性中:一个到一个MKMapView,一个到一个CLLocationManager.
=使用MKMapView您想要的任何其他窗口镶边创建一个XIB文件.将插座连接到控制器属性.确保MKMapView不要关注用户位置.
=让UIViewController实现CLLocationManagerDelegate协议 - 尤其locationManager:didUpdateToLocation:fromLocation:是每当新的位置值可用时将调用的方法.我们将控制器设置为位置管理器的委托.
=在viewController的loadView方法中,使用其中的NIB加载MKMapView.要提供用户反馈,您可能需要UIActivityIndicatorView设置一个微调器并将其设置为startAnimating.然后你开始:
self.locationManager = [[CLLocationManager alloc] init];
self.locationManager.delegate = self;
self.locationManager.desiredAccuracy = kCLLocationAccuracyKilometer;
self.locationManager.distanceFilter = 10; // or whatever
[self.locationManager startUpdatingLocation];
Run Code Online (Sandbox Code Playgroud)
= locationManager:didUpdateToLocation:fromLocation:检查事件是否自最近N秒后更新.然后告诉位置管理器停止更新,微调器停止动画,并获取纬度/经度数据并将其与视图范围和区域一起分配到地图视图,以便缩放并居中到正确的位置.
=现在这里是棘手的部分:蓝色大理石'throbber'是mapview跟踪用户位置的一个功能.你必须暂时"假装"它,直到真正的人开始(或者只是为当前位置使用单独的标记并自己保持其位置).就个人而言,我会选择用户熟悉的蓝色大理石.
=为了使其在启动时显示,您需要创建一个自定义MKAnnotationView,只需在位置管理器返回的位置添加蓝色大理石图形.这意味着拍摄一个Mapview的快照,其中显示的位置,然后将蓝色大理石拉出来并将其用作自定义注释视图的图像.
=如果您希望它主动跟踪地图,您可以启用mapview的用户位置跟踪,当它获取实际数据时,您隐藏先前设置的标记并让mapview进行更新.另一种选择是允许现有的位置管理器每隔一秒左右继续接收更新,并自己更新蓝色大理石注释的位置.
=要让mapview自己的userLocation执行更新添加到viewDidLoad:
[self.map.userLocation addObserver:self
forKeyPath:@"location"
options:(NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld)
context:NULL];
self.map.showsUserLocation = YES; // starts updating user location
Run Code Online (Sandbox Code Playgroud)
=实施observeValueForKeyPath.当locationmapview的属性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
}
Run Code Online (Sandbox Code Playgroud)
=为了避免显示当前位置的预热延迟,请保持对包含地图和位置管理器的viewController的引用,这样它就不会消失(这有点像记忆,但如果你释放它,你会有再次等待,直到MapView加载瓷砖并准备好去).
=在viewWillLoad你可以将最后一个已知位置填入自定义bluemarble注释并显示它.打开/关闭userLocation跟踪,当你收到通知时,同样的hide-the-annotation-show-the-real-marble技巧将起作用.mapview自己的位置管理器启动,当它有数据时,您可以使注释标记消失.
=您可能希望实现viewController的viewWillDisappear方法并手动关闭userLocationmapview上的跟踪,以便在下次启动视图时默认关闭.您还希望获得最后一次知道userLocation并将其保存到下一个开始.这样,您可以在viewWillAppear方法中执行所有定位标记 - 玩杂耍,而不必担心userLocation干扰,直到您准备好它为止.
祝好运.
zak*_*rya 27
在你的控制器中:
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
CLLocationCoordinate2D coord = {latitude: 37.423617, longitude: -122.220154};
MKCoordinateSpan span = {latitudeDelta: 1, longitudeDelta: 1};
MKCoordinateRegion region = {coord, span};
[mapView setRegion:region];
}
Run Code Online (Sandbox Code Playgroud)
当地图出现时,它将以帕洛阿尔托为中心
| 归档时间: |
|
| 查看次数: |
53351 次 |
| 最近记录: |