Подтвердить что ты не робот

MKMapView приближается к местоположению пользователей на viewDidLoad?

Я пытаюсь увеличить карту в текущее местоположение пользователя после загрузки представления, но я получаю сообщение об ошибке "** * Завершение приложения из-за неотображенного исключения" NSInvalidArgumentException ", причина:" Недействительный регион ' "при загрузке представления. Пожалуйста, кто-нибудь может помочь?

Ура!

- (void)viewDidLoad
{
    [super viewDidLoad];

    MKCoordinateRegion mapRegion;   
    mapRegion.center.latitude = map.userLocation.coordinate.latitude;
    mapRegion.center.longitude = map.userLocation.coordinate.longitude;
    mapRegion.span.latitudeDelta = 0.2;
    mapRegion.span.longitudeDelta = 0.2;
    [map setRegion:mapRegion animated: YES];   
}
4b9b3361

Ответ 1

Вы установили showsUserLocation = YES? MKMapView не будет обновлять местоположение, если оно установлено на NO. Поэтому убедитесь в этом.

Весьма вероятно, что объект MKMapView еще не имеет местоположения пользователя. Правильно, вы должны принять протокол MKMapViewDelegate и реализовать mapView:didUpdateUserLocation:

map.delegate = self;

...
-(void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation 
{
    MKCoordinateRegion mapRegion;   
    mapRegion.center = mapView.userLocation.coordinate;
    mapRegion.span.latitudeDelta = 0.2;
    mapRegion.span.longitudeDelta = 0.2;

    [mapView setRegion:mapRegion animated: YES];
}

Ответ 2

Как и в случае с ответом Дипака, кроме того, что вы можете более элегантно установить диапазон:

- (void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation {
    MKCoordinateRegion mapRegion;   
    mapRegion.center = map.userLocation.coordinate;
    mapRegion.span = MKCoordinateSpanMake(0.2, 0.2);
    [map setRegion:mapRegion animated: YES];
}

Ответ 3

Вы не хотите обновлять этот материал внутри userDidUpdateLocation, если есть вероятность, что пользователь захочет прокрутить карту. Если вы поместите этот код в указанный метод, пользователь не сможет прокручивать карту, потому что функция будет вызываться и центрировать карту обратно в текущее местоположение.

Ответ 4

Самым простым способом является использование mapView.showAnnotations в файле doUpdateUserLocation:

func mapView(mapView: MKMapView!, didUpdateUserLocation userLocation: MKUserLocation!) {
    mapView.showAnnotations([userLocation], animated: true)
}

Что все!

MKUserLocation соответствует протоколу MKAnnation. Передайте userLocation в виде массива, метод showAnnotations позволит mapView масштабировать область и дополнять, охватывая массив MKAnnotations, в этом случае это просто userLocation. Работает для меня.

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

Ответ 5

Проблема, возникающая при использовании метода didUpdateUserLocation, вы не сможете прокручивать или масштабировать в другое место. Он будет указывать на ваше местоположение. Лучшим способом (который я пробовал) является то, что вам нужно использовать диспетчер местоположений.

В viewDidLoad добавьте следующее:

self.locationManager = [[CLLocationManager alloc] init];
self.locationManager.delegate = self;
self.locationManager.desiredAccuracy = kCLLocationAccuracyBest;
self.locationManager.distanceFilter = kCLLocationAccuracyKilometer;;
// showing user location with the blue dot
[self.mapView setShowsUserLocation:YES];

self.mapView.delegate = self;

// getting user coordinates
CLLocation *location = [_locationManager location];
CLLocationCoordinate2D  coordinate = [location coordinate];


// showing them in the mapView
_mapView.region = MKCoordinateRegionMakeWithDistance(coordinate, 250, 250);

[self.locationManager startUpdatingLocation];

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

Ответ 6

Вот ответ @Deepak в Swift 3 для iOS 10:

extension ViewController: MKMapViewDelegate
{
    func mapView( _ mapView: MKMapView, didUpdate userLocation: MKUserLocation )
    {
        let regionRadius = 400 // in meters
        let coordinateRegion = MKCoordinateRegionMakeWithDistance( userLocation.coordinate, regionRadius, regionRadius )
        self.mapView.setRegion( coordinateRegion, animated: true)
    }
}

Ответ 7

......

MKCoordinateRegion region =mapView.region;

region.center.latitude = currentLocation.latitude ;
region.center.longitude = currentLocation.longitude;
region.span.longitudeDelta /= 1000.0;
region.span.latitudeDelta /= 1000.0;

[mapView setRegion:region animated:YES];
[mapView regionThatFits:region];

Ответ 8

Проверьте метод setUserTrackingMode MKMapView. Вероятно, самый простой способ отслеживания местоположения пользователя в MKMapView -

[self.mapView setUserTrackingMode:MKUserTrackingModeFollow animated:YES];

Таким образом, вам также не нужно быть MKMapViewDelegate. Возможные режимы:

MKUserTrackingModeNone = 0, // the user location is not followed
MKUserTrackingModeFollow, // the map follows the user location
MKUserTrackingModeFollowWithHeading, // the map follows the user location and heading

Ответ 9

Проверьте значение map.userLocation.coordinate, остальное в порядке.

Ответ 10

версия Swift 3 Используйте этот метод для увеличения любой координаты.

extension MKMapView{
    func zoomIn(coordinate: CLLocationCoordinate2D, withLevel level:CLLocationDistance = 10000){
        let camera =
            MKMapCamera(lookingAtCenter: coordinate, fromEyeCoordinate: coordinate, eyeAltitude: level)
        self.setCamera(camera, animated: true)
    }
}