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.