Анимированный зум до местоположения / метки карты при открытии карты iOS
Я видел это в других приложениях, например, в ios 6 starbucks, когда открывается мой картограф, я хочу, чтобы он отображал регион как весь Британский / Британский острова, а затем я хочу, чтобы он увеличивал мои указанные точки региона.,
Обновленный код:
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view.
[mapView setMapType:MKMapTypeStandard];
[mapView setZoomEnabled:YES];
[mapView setScrollEnabled:YES];
MKCoordinateRegion region = { {0.0, 0.0 }, { 0.0, 0.0 } };
region.center.latitude = 54.5;
region.center.longitude = -3.5;
region.span.longitudeDelta = 10.0f;
region.span.latitudeDelta = 10.0f;
[mapView setRegion:region animated:NO];
[self performSelector:@selector(zoomInToMyLocation)
withObject:nil
afterDelay:2]; //will zoom in after 1.5 seconds
}
-(void)zoomInToMyLocation
{
MKCoordinateRegion region = { {0.0, 0.0 }, { 0.0, 0.0 } };
region.center.latitude = 51.502729 ;
region.center.longitude = -0.071948;
region.span.longitudeDelta = 0.19f;
region.span.latitudeDelta = 0.19f;
[mapView setRegion:region animated:YES];
[mapView setDelegate:self];
[self performSelector:@selector(selectAnnotation)
withObject:nil
afterDelay:0.5]; //will zoom in after 0.5 seconds
}
-(void)selectAnnotation
{
DisplayMap *ann = [[DisplayMap alloc] init];
ann.title = @"Design Museum";
ann.subtitle = @"Camberwell, London";
ann.coordinate = region.center;
[mapView addAnnotation:ann];
}
Не знаю, если это правильно, потому что ошибка этой строки
ann.coordinate = region.center;
2 ответа
Если вы хотите начать с показа одного региона, а затем увеличить, вы должны выпустить два или более setRegion
звонит, потому что setRegion
сам по себе не позволяет контролировать начальную область или скорость анимации.
В viewDidLoad
установить начальный регион span
так что вся Великобритания видна (попробуйте дельты 10.0
вместо 0.15
). Вы также можете установить animated
в NO
для начального региона.
Потом до конца viewDidLoad
запланируйте увеличение на несколько секунд позже:
- (void)viewDidLoad
{
...
[self performSelector:@selector(zoomInToMyLocation)
withObject:nil
afterDelay:5]; //will zoom in after 5 seconds
}
zoomInToMyLocation
Метод может выглядеть так:
-(void)zoomInToMyLocation
{
MKCoordinateRegion region = { {0.0, 0.0 }, { 0.0, 0.0 } };
region.center.latitude = 51.502729 ;
region.center.longitude = -0.071948;
region.span.longitudeDelta = 0.15f;
region.span.latitudeDelta = 0.15f;
[mapView setRegion:region animated:YES];
}
Одна вещь, о которой вам, возможно, придется позаботиться при использовании performSelector
- отменить ожидающий вызов, если представление закрыто или освобождено до запланированного запуска вызова. Например, если пользователь закрывает вид через две секунды после его загрузки. Три секунды спустя запланированный метод все еще может быть вызван, но потерпит крах, так как представление исчезло. Чтобы избежать этого, отмените все ожидающие исполнения в viewWillDisappear:
или где это уместно:
[NSObject cancelPreviousPerformRequestsWithTarget:self];
MKCoordinateRegion region = { {0.0, 0.0 }, { 0.0, 0.0 } };
region.center.latitude = Your Latitude ;
region.center.longitude = Your Longitude;
region.span.longitudeDelta = 0.01f;
region.span.latitudeDelta = 0.01f;
[map setRegion:region animated:YES];
[map addAnnotation:ann];