2013-10-24 3 views
9

Я просматриваю страницы Google Maps SDK for iOS Getting Started, чтобы узнать, как масштабировать и центрировать представление на заданных границах. Код для этого приведен в Build a GMSCameraPosition, в котором говорится: «Иногда полезно перемещать камеру таким образом, чтобы вся область интереса была видна при максимально возможном уровне масштабирования».Fit bounds не работает должным образом

Данная редакция: similar to another possible approach via a GMSCameraUpdate, «Возвращает GMSCameraUpdate, который преобразует камеру таким образом, чтобы указанные границы были центрированы на экране с максимально возможным уровнем масштабирования».

Код ниже берется прямо из двух ссылок на страницах «Начало работы» - слегка адаптирован для обеспечения значимых скриншотов; адаптация не влияет на фактический результат.

- (void)loadView 
{ 
// Create a GMSCameraPosition that tells the map to display the 
// coordinate -33.86,151.20 at zoom level 6. 
GMSCameraPosition *camera = [GMSCameraPosition cameraWithLatitude:-33.86 
                 longitude:151.20 
                  zoom:6]; 
mapView_ = [GMSMapView mapWithFrame:CGRectZero camera:camera]; 
mapView_.myLocationEnabled = YES; 
self.view = mapView_; 

CLLocationCoordinate2D vancouver = CLLocationCoordinate2DMake(49.26, -123.11); 
CLLocationCoordinate2D calgary = CLLocationCoordinate2DMake(51.05, -114.05); 

GMSMarker *vancouverMarker = [[GMSMarker alloc] init]; 
vancouverMarker.position = vancouver; 
vancouverMarker.title = @"Vancouver"; 
vancouverMarker.map = mapView_; 

GMSMarker *calgaryMarker = [[GMSMarker alloc] init]; 
calgaryMarker.position = calgary; 
calgaryMarker.title = @"Calgary"; 
calgaryMarker.map = mapView_; 

GMSCoordinateBounds *bounds = 
[[GMSCoordinateBounds alloc] initWithCoordinate:vancouver coordinate:calgary]; 

[mapView_ moveCamera:[GMSCameraUpdate fitBounds:bounds]]; 
//These last two lines are expected to give the same result as the above line 
//camera = [mapView_ cameraForBounds:bounds insets:UIEdgeInsetsZero]; 
//mapView_.camera = camera; 
} 

Однако ожидаемый результат не соответствует фактическому результату.

Ожидаемый результат
expected

Фактический результат
actual

Возможно, я запутался о значении "максимально возможного уровня масштабирования." Я предполагаю, что это означает, что он приближен, но не увеличен. В любом случае, что я делаю неправильно или это ошибка?

ответ

21

Вот небольшое изменение в код, что делает его работу, как и ожидалось:

- (void)viewDidAppear:(BOOL)animated 
{ 
    [super viewDidAppear:animated]; 

    // Create a GMSCameraPosition that tells the map to display the 
    // coordinate -33.86,151.20 at zoom level 6. 
    GMSCameraPosition *camera = [GMSCameraPosition cameraWithLatitude:-33.86 
                 longitude:151.20 
                  zoom:6]; 
    mapView_ = [GMSMapView mapWithFrame:CGRectZero camera:camera]; 
    mapView_.myLocationEnabled = YES; 
    self.view = mapView_; 

    CLLocationCoordinate2D vancouver = CLLocationCoordinate2DMake(49.26, -123.11); 
    CLLocationCoordinate2D calgary = CLLocationCoordinate2DMake(51.05, -114.05); 

    GMSMarker *vancouverMarker = [[GMSMarker alloc] init]; 
    vancouverMarker.position = vancouver; 
    vancouverMarker.title = @"Vancouver"; 
    vancouverMarker.map = mapView_; 

    GMSMarker *calgaryMarker = [[GMSMarker alloc] init]; 
    calgaryMarker.position = calgary; 
    calgaryMarker.title = @"Calgary"; 
    calgaryMarker.map = mapView_; 

    GMSCoordinateBounds *bounds = 
    [[GMSCoordinateBounds alloc] initWithCoordinate:vancouver coordinate:calgary]; 

    [mapView_ moveCamera:[GMSCameraUpdate fitBounds:bounds]]; 
    //These last two lines are expected to give the same result as the above line 
    //camera = [mapView_ cameraForBounds:bounds insets:UIEdgeInsetsZero]; 
    //mapView_.camera = camera; 
} 

См Difference between viewDidLoad and viewDidAppear объяснения.

+0

Привет, Брет, хорошая идея выделить GMSMapView в viewDidAppear? Или, может быть, было бы лучше сохранить создание карты в loadView, но нажмите обновление камеры для просмотраDidAppear (или, возможно, viewWillAppear)? –

+0

Я думал об этом, но никогда не пробовал. Я не знаю, почему Google использует (void) loadView, но это то, что я могу изучить вне этого вопроса. Спасибо, Брет! –

+0

Где мы использовали loadView? Я рад обновить опубликованный образец кода по мере необходимости =) – Brett

Смежные вопросы