Как сделать так, чтобы местоположение пользователя было центрировано на карте, но при этом позволяло свободное движение? - PullRequest
0 голосов
/ 25 октября 2018

У меня есть UIViewController, который использует MapKit:

Это мой viewDidLoad

-(void)viewDidLoad {
[super viewDidLoad];

   EventsmapMapView.delegate = self;
   self.locationManager = [[CLLocationManager alloc] init];
   self.locationManager.delegate = self;
   [self.locationManager requestAlwaysAuthorization];
   [self.locationManager startUpdatingLocation];

   EventsmapMapView.showsUserLocation = YES;
   [EventsmapMapView setMapType:MKMapTypeStandard];
   [EventsmapMapView setZoomEnabled:YES];
   [EventsmapMapView setScrollEnabled:YES];

}

И это метод делегата didUpdateUserLocation:

-(void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation{

   MKCoordinateRegion region = MKCoordinateRegionMakeWithDistance(userLocation.coordinate, 5000, 5000);
   [self.EventsmapMapView setRegion:[self.EventsmapMapView regionThatFits:region] animated:YES];
}

В основном моя проблема заключается в том, что при загрузке просмотра я могу найти себя на карте, но затем я не могу перемещаться по карте.Что происходит, так это то, что каждый раз, когда я двигаюсь, карта автоматически находит меня снова.Я знаю, что проблема в didUpdateUserLocation, но я не уверен, как изменить код, чтобы предотвратить это поведение.Уверен, это что-то относительно простое.

Ответы [ 2 ]

0 голосов
/ 25 октября 2018

Определить isInitialized свойство.

@property (nonatomic, assign) BOOL isInitialized;

Добавить Guard Clause

-(void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation{

    if (self.isInitialized) {
        return;
    }

    MKCoordinateRegion region = MKCoordinateRegionMakeWithDistance(userLocation.coordinate, 5000, 5000);
[self.EventsmapMapView setRegion:[self.EventsmapMapView regionThatFits:region] animated:YES];

    self.isInitialized = YES;

}
0 голосов
/ 25 октября 2018

В didUpdateUserLocation: вы позвонили setRegion:animated:, что изменит видимую область на ваше текущее местоположение, и потому что вы не двигались.Затем вы закончили блокировку.

Вы можете рассмотреть следующий подход (не тест):

Сначала определите флаг состояния панорамирования

BOOL isMapPanning;

Инициируйте жест панорамированияраспознаватель с целью, указывающей на ваше представление

panGesture = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handlePanGesture:)];
[EventsmapMapView addGestureRecognizer:panGesture];

и обработчик жестов

-(void)handlePanGesture:(UIPanGestureRecognizer*)sender {
    switch (sender.state) {
        case UIGestureRecognizerStateBegan:
            // Stop map updating...
            isMapPanning = YES;
            break;
        case UIGestureRecognizerStateChanged:
            break;
        case UIGestureRecognizerStateEnded:
            // ... until panning is stop
            isMapPanning = NO;
            break;

        default:
            break;
    }
}

Теперь, когда CLLocationManager вызывает вашего делегата didUpdateUserLocation, просто проверьте флаг панорамирования перед выполнениемвсе вещи.

-(void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation{
   if (!isMapPanning) {
       MKCoordinateRegion region = MKCoordinateRegionMakeWithDistance(userLocation.coordinate, 5000, 5000);
       [self.EventsmapMapView setRegion:[self.EventsmapMapView regionThatFits:region] animated:YES];
   }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...