Я использую MapKit для отображения местоположения пользователя относительно контактов вокруг них. Я хотел бы смочь подражать функциональности, которая Карты обеспечивает через кнопку перекрестия в нижнем левом углу экрана. Я уже знаю, что MapKit предоставляет объекту CLLocation местоположение пользователя через MKUserLocation, я просто хотел обратиться за советом о том, как я должен сосредоточить внимание на том местоположении. Мой начальный наклон состоял в том, чтобы использовать NSTimer для центрирования карты на той координате каждые 500 мс или около этого.
Существует ли лучший способ сделать это? Там что-то встроено к MapKit, который я пропускаю, который выполнит это?
Большое спасибо, Brendan
Я думаю, что на самом деле я бы использовал CoreLocation CLLocationManager
и использовал его метод делегата locationManager:didUpdateToLocation:fromLocation:
.
Таким образом, у вас не будет накладных расходов на NSTimer
, и обновление произойдет только тогда, когда будет доступно новое местоположение.
Вы можете извлечь долготу и широту из объекта CLLocation
, отправленного в метод locationManager:didUpdateToLocation:fromLocation:
, и передать их в представление карты.
Я соглашаюсь с ответом Якова Релкина. Этот учебник содержит пошаговую процедуру использования CoreLocation в приложении для iPhone. Надеюсь, это вам поможет.
Всего наилучшего.
Очень просто сделать так, чтобы карта автоматически обновляла местоположение пользователя, как карты Google. Просто установите для showUserLocation значение YES
self.mapView.showsUserLocation = YES
... а затем реализуйте MKMapViewDelegate для повторного центрирования карты при обновлении местоположения.
-(void) mapView:(MKMapView *)mapView
didUpdateUserLocation:(MKUserLocation *)userLocation
{
if( isTracking )
{
pendingRegionChange = YES;
[self.mapView setCenterCoordinate: userLocation.location.coordinate
animated: YES];
}
}
И чтобы позволить пользователю масштабировать и панорамировать, не возвращая вид обратно к текущему местоположению...
-(void) mapView:(MKMapView *)mapView regionWillChangeAnimated:(BOOL)animated
{
if( isTracking && ! pendingRegionChange )
{
isTracking = NO;
[trackingButton setImage: [UIImage imageNamed: @"Location.png"]
forState: UIControlStateNormal];
}
pendingRegionChange = NO;
}
-(IBAction) trackingPressed
{
pendingRegionChange = YES;
isTracking = YES;
[mapView setCenterCoordinate: mapView.userLocation.coordinate
animated: YES];
[trackingButton setImage: [UIImage imageNamed: @"Location-Tracking.png"]
forState: UIControlStateNormal];
}