С MKMapView
существует опция, названная "Выставочные пользователи текущее местоположение", которое автоматически покажет пользовательское местоположение на map
.
Я хотел бы переместить и масштабировать к этому местоположению, когда оно нашло (и если оно изменяется).
Проблема, кажется, нет никакого метода, названного, когда пользовательское местоположение обновляется на map
, таким образом, я нигде не должен помещать код, который будет zoom/scroll
.
Есть ли путь, который будет уведомлен когда MKMapView
имеет (или обновленный) пользовательское местоположение, таким образом, я могу перемещаться/масштабировать в него? Если я использую свое собственное CLLocationManager
обновления, которые я получаю, не соответствуют обновлениям пользовательского маркера на карте, таким образом, выглядит глупым, когда мои перемещения карты и масштабируют за секунды до того, как синий контакт появляется.
Это чувствует себя подобно основной функциональности, но я провел недели, ища решение и не поднял что-нибудь похожее.
Вы должны зарегистрироваться для получения уведомлений KVO о свойстве userLocation.location
MKMapView
.
Для этого поместите этот код в viewDidLoad:
вашего ViewController или где-нибудь в том месте, где инициализируется ваше представление карты.
[self.mapView.userLocation addObserver:self
forKeyPath:@"location"
options:(NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld)
context:NULL];
Затем реализуйте этот метод для получения уведомлений KVO
- (void)observeValueForKeyPath:(NSString *)keyPath
ofObject:(id)object
change:(NSDictionary *)change
context:(void *)context {
if ([self.mapView showsUserLocation]) {
[self moveOrZoomOrAnythingElse];
// and of course you can use here old and new location values
}
}
Этот код мне подходит.
Кстати, self
в этом контексте мой ViewController.
Нет проблем ... Внутри метода viewDidLoad вашего подкласса UIViewController, который имеет MKMapView, добавьте это (при условии, что ваш MKMapView называется map):
CLLocation *location = [[[CLLocation alloc] initWithLatitude:map.centerCoordinate.latitude longitude:map.centerCoordinate.longitude] autorelease]; //Get your location and create a CLLocation
MKCoordinateRegion region; //create a region. No this is not a pointer
region.center = location.coordinate; // set the region center to your current location
MKCoordinateSpan span; // create a range of your view
span.latitudeDelta = BASE_RADIUS / 3; // span dimensions. I have BASE_RADIUS defined as 0.0144927536 which is equivalent to 1 mile
span.longitudeDelta = BASE_RADIUS / 3; // span dimensions
region.span = span; // Set the region's span to the new span.
[map setRegion:region animated:YES]; // to set the map to the newly created region