Расположение ядра iOS Установите Pin для расположения пользователя в viewDidLoad - PullRequest
1 голос
/ 13 июля 2011

Я пытаюсь установить аннотацию карты к текущему местоположению пользователя. Я пытаюсь установить контакт в методе viewDidLoad, потому что метод

- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation

Еще не был вызван, lat и long - 0,000000. Есть ли способ вызвать этот метод в моем viewDidLoad или любом другом решении, которое заставит булавку появляться в моем начальном местоположении, когда приложение загружается?

ОБНОВЛЕНИЕ, добавлен код аннотации

CLLocationCoordinate2D theCoordinate;
theCoordinate.latitude = (_currentLocation.latitude);
    theCoordinate.longitude = (_currentLocation.longitude);
    NSLog(@"The Coordinate Value:");
    NSLog(@"%f, %f",theCoordinate.latitude,theCoordinate.longitude);

    DDAnnotation *annotation = [[[DDAnnotation alloc] initWithCoordinate:theCoordinate addressDictionary:nil] autorelease];
    annotation.title = @"Drag to Move Pin";
    annotation.subtitle = [NSString stringWithFormat:@"%f %f", annotation.coordinate.latitude, annotation.coordinate.longitude];

    [self.mapView addAnnotation:annotation];

ОБНОВЛЕНИЕ 2 Все еще не работает, код находится в методе didUpdateLocation

static BOOL annotationAdded = NO;

if (!annotationAdded) {
    annotationAdded = YES;
        CLLocationCoordinate2D theCoordinate;
        theCoordinate.latitude = _currentLocation.latitude;
        theCoordinate.longitude = _currentLocation.longitude;
        //Sets Initial Point to Africa Because Method to obtain current Location
        //Hasen't Fired when View Loads
        theCoordinate.latitude = (mapView.userLocation.coordinate.latitude);
        theCoordinate.longitude = (mapView.userLocation.coordinate.longitude);
        NSLog(@"The Coordinate Value:");
        NSLog(@"%f, %f",theCoordinate.latitude,theCoordinate.longitude);

        DDAnnotation *annotation = [[[DDAnnotation alloc] initWithCoordinate:theCoordinate addressDictionary:nil] autorelease];
        annotation.title = @"Drag to Move Pin";
        annotation.subtitle = [NSString stringWithFormat:@"%f %f", annotation.coordinate.latitude, annotation.coordinate.longitude];

        [self.mapView addAnnotation:annotation];
}

Ответы [ 3 ]

3 голосов
/ 13 июля 2011

MKMapView автоматически помещает аннотацию класса MKUserLocation, когда вы устанавливаете mapView.showsUserLocation = YES.

Вы можете заменить представление по умолчанию для этой аннотации на любое представление по умолчанию, которое вы хотите, выполнив это в mapView:viewForAnnotation::

- (MKAnnotationView *) mapView:(MKMapView *)theMapView viewForAnnotation:(id <MKAnnotation>)annotation {
    if ([annotation isKindOfClass:[MKUserLocation class]]) {
        // replace the following with code to generate and return custom user position annotation view
        return customAnnotationView;
    }

    //*** other code ***//
}

Обновление:

Если все, что вы хотите сделать, это установить (сначала) пин-код в месте пользователя при загрузке представления, то вам придется подождать, пока телефон сможет получить нужные вам данные, поскольку это занимает некоторое время. Добавьте свою аннотацию в mapView:didUpdateUserLocation при первом вызове, и это должно помочь:

- (void) mapView:(MKMapView *)theMapView didUpdateUserLocation:(MKUserLocation *)userLocation {
    static BOOL annotationAdded = NO;

    if (!annotationAdded) {
        annotationAdded = YES;
        //*** add annotation to mapView ***//
    }
}

Заключительный комментарий:

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

Просто предостережение. Очевидно, что вы выбираете, зависит от цели вашего приложения.

0 голосов
/ 13 июля 2011

Устройству требуется некоторое время, чтобы определить местоположение - вы не можете ускорить процесс, вызвав -locationManager: didUpdateToLocation: самостоятельно.Вам нужно будет либо воспользоваться предложением @ Matt, чтобы карта нарисовала местоположение пользователя, либо дождаться вызова -... didUpdateToLocation: и предпринять действия.

0 голосов
/ 13 июля 2011

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

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