Мне удалось решить эту проблему, создав подкласс UIViewController
для хранения экземпляра MKMapView
. Я восстановил диапазон mapView в loadView
, а затем вызвал [mapView setUserTrackingMode:...]
в методе viewWillAppear
VC.
Я видел поведение OP, описанное в предыдущей реализации, где я на лету создал VC и экземпляр MKMapView, а затем вставил его в мой контроллер навигации. Мне никогда не удавалось ни установить диапазон, ни настроить отслеживание пользователей, чтобы они следовали за пользователем без потери интервала. Я выполнил некоторую отладку и даже увидел, что исходные значения диапазона были отброшены при отображении представления, поэтому я думаю, что это как-то связано с настройкой диапазона или режима отслеживания пользователя без отображения представления. В любом случае, организация кода, описанного выше, решила проблему.
Вот соответствующие биты:
// ===== mainVC.h =====
#import <UIKit/UIKit.h>
#import <MapKit/MapKit.h>
@interface MapVC : UIViewController <MKMapViewDelegate>
@end
// ===== mainVC.m =====
static MapVC *map = nil;
- (void)mapAction {
UINavigationController *nav = [self navigationController];
// map VC is a singleton
if (!map) map = [[MapVC alloc] init];
[nav pushViewController:map animated:TRUE];
}
// ===== MapVC.m =====
- (void)loadView {
mapView = [[MKMapView alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
[mapView setDelegate:self];
MKCoordinateSpan span = MKCoordinatSpanMake(storedLatitudeDelta, storedLongitudeDelta);
[mapView setRegion:MKCoordinateRegionMake(storedCenter, span)];
[self setView:mapView];
}
- (void)viewWillAppear:(BOOL)animated {
[mapView setUserTrackingMode:MKUserTrackingModeFollow animated:TRUE];
}
- (void)mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated {
MKCoordinateSpan mySpan = [mapView region].span;
storedLatitudeDelta = mySpan.latitudeDelta;
storedLongitudeDelta = mySpan.longitudeDelta;
}
Я сократил это из более крупного проекта, поэтому дайте мне знать, если вы видите какие-либо опечатки, но в этом суть.