Как отслеживать местоположение пользователя с помощью MapKit - PullRequest
10 голосов
/ 14 марта 2010

Я использую MapKit для отображения местоположения пользователя относительно булавок вокруг них. Я хотел бы иметь возможность имитировать функциональность, предоставляемую приложением «Карты» с помощью кнопки перекрестия в левом нижнем углу экрана. Я уже знаю, что MapKit предоставляет объект CLLocation с местоположением пользователя через MKUserLocation, я просто хотел получить совет о том, как мне сосредоточиться на этом местоположении. Сначала я хотел использовать NSTimer для центрирования карты по этой координате каждые 500 мс или около того.

Есть ли лучший способ сделать это? Есть ли что-то встроенное в MapKit, которое мне не хватает, чтобы выполнить это?

Большое спасибо, Брендан

Ответы [ 4 ]

39 голосов
/ 20 апреля 2013

Если вы используете IOS5 +, это ОЧЕНЬ легко. Просто измените "userTrackingMode", используя такой код, как:

[_mapView setUserTrackingMode:MKUserTrackingModeFollow animated:YES];

Это будет плавно следовать текущему местоположению пользователей. Если вы перетащите карту, она даже установит режим отслеживания обратно на MKUserTrackingModeNone, что обычно соответствует желаемому поведению.

12 голосов
/ 01 сентября 2010

Очень просто сделать так, чтобы карта автоматически обновляла местоположение пользователя, как карты 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];
}
7 голосов
/ 14 марта 2010

Я думаю, что на самом деле я бы использовал CoreLocation CLLocationManager и использовал бы его метод делегата locationManager:didUpdateToLocation:fromLocation:.

Таким образом, у вас нет накладных расходов NSTimer, и он обновляется только при наличии нового местоположения.

Вы можете извлечь долготу и широту из объекта CLLocation, отправленного методу locationManager:didUpdateToLocation:fromLocation:, и передать его в представление карты.

0 голосов
/ 14 марта 2010

Я согласен с ответом Джейкоба Релкина. В этом руководстве приведена пошаговая процедура использования CoreLocation в приложении для iPhone. Надеюсь, это поможет вам.

Всего наилучшего.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...