2012-02-25 4 views
2

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

Я нашел решение, реализующее метод 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 файл и initialied его с NO в ViewDidLoad.

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

ответ

5

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

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

+1

Мне нужна служба определения местоположения все время, потому что я разрабатываю (на самом деле для изучения) приложение на основе карты. Оператор If не является большой проблемой производительности, но, поскольку мне это нужно все время, это может быть. Интересно, могу ли я выполнить эту задачу в другом месте, потому что мне это нужно только один раз (при запуске). – Beraldo

+0

@ Ник, нет, я не согласен с вами, не было бы проблем, если кому-то не нужно постоянно устанавливать службы поиска.нам просто нужно правильно запрограммировать метод didUpdateToLocation и stopUpdatingLocation. Both.We можно сделать это. Предположим, что мы показываем CurrentLocation по определенному (A). Затем нам просто нужно вызвать didUpdateToLocation из ViewLoadingTime и вызвать stopUpdatingLocation, когда View go to disAppear (- (void) viewWillDisappear: (BOOL) анимированный метод.). – Kamarshad

2

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

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

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

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

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

2

Вы можете инициализировать и начать получать обновления местоположения, когда захотите. 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

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

Смежные вопросы