Как отслеживать местоположение пользователя с помощью MapKit

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

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

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


person bloudermilk    schedule 14.03.2010    source источник


Ответы (4)


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

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

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

person Jacob Relkin    schedule 14.03.2010
comment
Разве это не было бы более бесполезным в конце концов, поскольку MapKit уже использует GPS? Я бы подумал, что GPS потребляет больше энергии, чем таймер. При этом есть действительно хороший шанс, что я ошибаюсь. Программирую на айфоне всего 1 неделю. - person bloudermilk; 14.03.2010
comment
То есть вы говорите, что Core Location не использует GPS? - person Jacob Relkin; 14.03.2010
comment
Я говорю, что CL действительно использует GPS. Таким образом, если два класса пинговали GPS-приемник (внутренний CLLocationManager MapKit для синего вывода местоположения пользователя и предлагаемый вами CLLocationManager), он мог бы использовать гораздо больше энергии, чем один внутренний MapKit CLLocationManager и простой NSTimer. Я полагаю, это сводится к тому, достаточно ли умен iPhone SDK для поддержки нескольких CLLocationManager без подключения каждого из них напрямую к GPS. Или, возможно, делегат MapKit предоставляет собственный didUpdateToLocation :? - person bloudermilk; 14.03.2010
comment
Думаю, мне просто нужно поверить, что это не разрушит срок службы батареи :) - person bloudermilk; 16.03.2010

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

[_mapView setUserTrackingMode:MKUserTrackingModeFollow animated:YES];

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

person Peter Theill    schedule 20.04.2013
comment
Еще одно доказательство очевидной ограниченности концепции принятого ответа. Это ответ, который должен быть на высоте! Ответ Джейкоба был отличным четыре года назад, но теперь он полностью устарел, но он навсегда останется первым ответом. - person KPM; 30.09.2014

Очень просто сделать так, чтобы карта автоматически обновляла местоположение пользователя, как и карты Google. Просто установите для showUserLocation значение ДА.

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];
}
person Paul Alexander    schedule 01.09.2010
comment
Лучше ли использовать центр MKMApView со следующим местоположением пользователя, чем CoreLocation? У меня был класс LocationUpdater, который при обновлении возвращает новый CLLocation. MKMapView обновляется с той же периодичностью? - person quantumpotato; 30.01.2011

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

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

person Warrior    schedule 14.03.2010