iOS - увеличение масштаба текущего местоположения пользователя при запуске приложения - PullRequest
2 голосов
/ 26 февраля 2012

Я хочу увеличить карту до текущего местоположения пользователя при запуске. Я попытался получить местоположение пользователя, используя mapView.userLocation.coordinate, в viewDidLoad, но возвращенная координата была (0,0), вероятно, потому что MapKit не «находил» местоположение пользователя при запуске.

Я нашел решение, реализующее метод didUpdateToLocation. Я сделал следующее:

- (void) locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation
{
    if ( hasZoomedAtStartUp == NO )
    {
        [self zoomAtStartUp]; // my method to zoom the map
        hasZoomedAtStartUp = YES;
    }
}

Переменная hasZoomedAtStartUp, которую я создал для файла .h и инициализировал ее значением NO в ViewDidLoad.

Это решение отлично работает, но я хотел бы знать, есть ли другой способ сделать это, без оператора if. Это IF относится только к запуску, поэтому я хочу удалить его из соображений производительности.

Ответы [ 4 ]

5 голосов
/ 26 февраля 2012

Я очень сомневаюсь, что оператор не справляется с ошибкой, если вам нужно беспокоиться о производительности.

Вам постоянно нужны службы определения местоположения?Если нет, вы, вероятно, получите гораздо большую выгоду от вызова stopUpdatingLocation, когда вам больше не нужно обновлять местоположение.Впоследствии вы даже не достигнете didUpdateToLocation, поскольку вы больше не получаете новые данные о местоположении.

2 голосов
/ 28 февраля 2012

Вы можете создать «начальную» реализацию делегата, которую вы можете отменить регистрацией после масштабирования до местоположения, и зарегистрировать свой «нормальный» делегат, которому теперь не требуется весь масштаб и, если вообще, требуется.

2 голосов
/ 26 февраля 2012

Вы можете инициализировать и начать получать обновления местоположения в любое время.CLLocationManager уведомит вашего делегата о получении нового местоположения и установит для этого местоположения на карте Регион значение Отображение

//Don't Forget To Adopt CLLocationManagerDelegate  protocol
//set up the Location manager     
locationManager = [[CLLocationManager alloc] init]; 
locationManager.desiredAccuracy = kCLLocationAccuracyBest; 
locationManager.distanceFilter = DISTANCE_FILTER_VALUE;
locationManager.delegate = self; 
[locationManager startUpdatingLocation]

//WIll help to get CurrentLocation implement the CLLocationManager  delegate
 - (void) locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation  *)newLocation fromLocation:(CLLocation *)oldLocation
{
// use this newLocation .coordinate.latitude
}

// set Span
MKCoordinateSpan span; 
//You can set span for how much Zoom to be display like below
span.latitudeDelta=.005;
span.longitudeDelta=.005;

//set Region to be display on MKMapView
MKCoordinateRegion cordinateRegion;
cordinateRegion.center=latAndLongLocation.coordinate;
//latAndLongLocation coordinates should be your current location to be display 
cordinateRegion.span=span;
//set That Region mapView 
[mapView setRegion:cordinateRegion animated:YES];
.
2 голосов
/ 26 февраля 2012

Метод, который вы используете сейчас, -locationManager:didUpdateToLocation:fromLocation - лучшее место, где можно что-либо сделать с пользовательским местоположением. Хотя есть пара вещей, которые я бы отличал от вас.

Прежде всего, вы принимаете самое первое обновление местоположения как лучшее. Возможно, вы просили определенную точность, но запрос на это не означает, что newLocation от этого метода является лучшим. Часто, вы получите очень низкую точность, или кешированное местоположение с некоторого времени в прошлом. Что бы я сделал, это проверил новое местоположение на возраст и точность, и только при хорошем увеличении.

Еще одна вещь, которую я хотел бы сделать, - отключить обновления местоположения, либо когда появилось обновление с хорошей точностью, либо через 30 секунд после запуска обновления. Установите таймер для его выключения, а когда вы его выключите, установите более длинный таймер, чтобы включить его и проверить снова.

Наконец, убедитесь, что вы правильно реализовали -locationManager:didFailWithError: для всех случаев. Это всегда одна из проверенных вещей, когда вы отправляете приложение. Если он не выйдет изящно (например, в режиме полета), он, вероятно, будет отклонен.

Поиск в переполнении стека методов и кода для выполнения этих задач.

...