MKMapView y viewDidLoad / viewWillAppear / viewDidAppear usando Storyboards

Tengo un ViewController con un MapView, el controller se inicializa con una segue especificada en el guión gráfico. El MapView está conectado (a través de Storyboard) a una propiedad en el controller.


file .h

@interface DetailViewController : UIViewController <MKMapViewDelegate> @property (weak, nonatomic) IBOutlet MKMapView *locationMapView; 

Estoy usando un método para centrar MapView en una región específica:

 - (void)centerMapView { MKCoordinateRegion region = MKCoordinateRegionMakeWithDistance(CLLocationCoordinate2DMake(geoPoint.latitude, geoPoint.longitude), 1000, 1000); [self.locationMapView setRegion:region animated:NO]; NSLog(@"size height: %f",self.locationMapView.frame.size.height); NSLog(@"size width: %f",self.locationMapView.frame.size.width); } 

Llamar a este método desde viewDidLoad / viewWillAppear no hace nada por primera vez, pero lo centra correctamente por segunda vez que se carga View. La salida del logging es siempre:

 size height: 0.000000 size width: 0.000000 

Cuando se llama en viewDidAppear MapView está centrado y el tamaño de salida es correcto:

 size height: 400.000000 size width: 320.000000 

Supongo que los valores de tamaño significan que la vista aún no se inicializó en viewDidLoad / viewWill Aparecerá, esto podría no estar relacionado con mi problema al configurar la región.

Me pregunto si realmente no es posible establecer la región de MapView en viewDidLoad / viewWillAppear para que el usuario no vea un cambio en la región.

¿Algún consejo?

El problema de tamaño de vista probablemente no esté relacionado con su problema al configurar la región.

La pregunta key: ¿Cuándo se DetailViewController la propiedad geoPoint , en relación con cuándo se carga su vista? Si viewDidLoad ejecuta antes de establecer esa propiedad (presumiblemente desde prepareForSegue:sender: en otro controller de vista), geoPoint será nil (cero) cuando intente centrar el map, por lo que no lo centrará correctamente. (Y funciona la segunda vez porque la instancia de DetailViewController ya existe y tiene su geoPoint de la hora anterior).

Puede considerar llamar al método centerMapView desde un centerMapView personalizado para su propiedad geoPoint , de esa manera se garantiza que sucederá una vez que el controller de vista tenga los datos apropiados, que seguirán antes de que aparezca, por lo que no habrá una transición de map visible.