-->

方法文档初始化的MKMapView与给定用户的位置?(HowTo initialise MKMapV

2019-07-18 07:40发布

我的应用程序知道当前用户的位置(CoreLocation.framework)。 作为为用户打开一个新的MapView很快他的iPhone开始再次搜索当前位置。 是否有可能跳过或更改的MKMapView第一使用者位置?

编辑:

是否有可能覆盖的MKMapView和使用其他的LocationManager?

Answer 1:

是的,它可能有一个单独的位置管理器对象和它的值分配给的MapView(顺便说一句,我使用“=”作为如下表前缀,以防止从所述borking SO代码格式化器)。

=在你UIViewController维护两个单独的属性:一个到MKMapView和一个到一个CLLocationManager

=创建具有一个XIB文件MKMapView和你想要的任何其他窗口镶边。 出口连接到控制器化子性质。 确保MKMapView不跟随用户的位置。

=具有的UIViewController实施CLLocationManagerDelegate协议-尤其是locationManager:didUpdateToLocation:fromLocation:方法每当一个新的位置值是可用的,其将被调用。 我们将设置控制器为代表的外景经理。

=在的viewController的loadView方法,加载与所述笔尖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];

=在locationManager:didUpdateToLocation:fromLocation:检查,看看是否该事件是自上次N秒更新一次。 然后告诉外景经理停止更新,微调器将停止动画,并获得纬度/经度数据,以便它放大和中心到正确的位置分配到地图视图,以期跨度和地区一起。

=现在,这里的棘手的部分:蓝色大理石“活动指示器”是的MapView跟踪用户位置的功能。 你将不得不暂时“假货”,直到真正的一个在踢(或只使用一个单独的标记当前位置,并保持自己的位置)。 个人而言,我会用蓝色大理石用户熟悉去。

=为了它,所以它显示了正确的启动,你需要创建一个自定义MKAnnotationView只有在通过位置管理器返回的位置添加蓝色大理石图形。 这意味着服用MapView类的快照与位置表示,然后使用Photoshop只是蓝色大理石,并在使用它作为一个自定义注解视图图像。

=如果你想让它积极跟踪地图,您可以启用的MapView的用户位置跟踪,当它得到的实际数据,你躲你之前设定的标记,让MapView的做更新。 另一种选择是让现有的位置管理器继续接收动态每秒左右,更新蓝色大理石的位置标注自己。

=为了让的MapView自己的用户位置不更新添加到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
}

=为了避免在显示当前位置的热身延迟,保持包含地图和位置管理,因此不会走一个参考的viewController(这是一个有点内存猪,但如果你释放它,你将有再等到MapView类加载瓦片和准备去)。

=在viewWillLoad可以的东西最后已知的位置到自定义bluemarble标注,并显示它。 开启/关闭的用户位置跟踪,当你得到通知同样隐藏最注解显示最真实的大理石招会奏效。 的MapView自己的位置经理踢,当它有数据,你可以让你的注释标记消失。

=你可能要实施的viewController的viewWillDisappear方法和手动关闭userLocation跟踪上的MapView所以它在默认情况下,下一次的观点是长大的了。 你也想获得最后已知userLocation ,并将其保存为下得到去。 这样一来,你可以做所有的定位标记戏法在viewWillAppear的方法,而不必担心用户位置干扰,直到你准备好了。

祝好运。



Answer 2:

在你的控制器:

- (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];
}

当贴图出现它会在靠近中心帕洛阿尔托



Answer 3:

尝试设置showUserLocation属性设置为false进行初始化,然后还原region地图视图以前有(你会明显有以前的地图被破坏之前存储此)。

这是你想要的吗?



Answer 4:

你并不需要使用另一个位置管理器,你可以添加你想要的任何地图点,通过任何你想要的其他逻辑更新。

比方说,你有一个套接字连接到遥控车,那车发回含有有效载荷的地理位置信息插座的数据。 你可以解析出来,你在实时地图上更新缩略图的位置。 是不需要的“用户位置”属性这一点,但你可以告诉它,如果你想。

用户的位置是只读的,你可以使用它或不。 这并不意味着你需要其他位置的经理做任何事情,你可能需要做。 这听起来像您的应用程序并不真正需要这个功能,但我可能是误解了你的问题。



文章来源: HowTo initialise MKMapView with a given user location?