2012-12-24 14 views
5

Possiedo un ViewController con MapView, il controller viene inizializzato da un passaggio specificato nello storyboard. MapView è connesso (tramite Storyboard) a una proprietà nel controller.MKMapView e viewDidLoad/viewWillAppear/viewDidAppear tramite Storyboard


file h

@interface DetailViewController : UIViewController <MKMapViewDelegate> 

@property (weak, nonatomic) IBOutlet MKMapView *locationMapView; 

Sto usando un metodo per centrare il MapView a una regione specifica:

- (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); 
} 

chiamata a questo metodo da viewDidLoad/viewWillAppear non fa nulla per la prima tempo, ma lo centra correttamente per la seconda volta che viene caricata la vista. L'uscita Log è sempre:

size height: 0.000000 
size width: 0.000000 

Quando viene chiamato in viewDidAppear è centrato il MapView e la dimensione di uscita è corretta:

size height: 400.000000 
size width: 320.000000 

Credo che i valori delle dimensioni significa che la vista non è ancora stato inizializzato in viewDidLoad/viewWill visualizzato, questo potrebbe non essere correlato al mio problema con l'impostazione della regione.

Mi chiedo, se davvero non è possibile impostare la regione di MapView in/viewWillAppear in modo che l'utente non veda una modifica della regione.

Qualche consiglio?

+0

Hai detto di aver provato questo in viewWillAppear? Altrimenti, provalo li dentro. –

+0

L'ho provato senza successo –

risposta

0

Il problema relativo alla dimensione della vista probabilmente non è correlato al problema con l'impostazione dell'area.

La domanda chiave: quando è impostata la proprietà DetailViewControllergeoPoint rispetto a quando viene caricata la vista? Se viewDidLoad viene eseguito prima di impostare tale proprietà (presumibilmente da prepareForSegue:sender: in un altro controller di visualizzazione), geoPoint sarà nullo (zero) quando si tenta di centrare la mappa, in modo da non centrarla correttamente. (E funziona la seconda volta perché l'istanza di DetailViewController già esiste e ha il suo geoPoint dalla volta precedente.)

Si potrebbe considerare di chiamare il metodo centerMapView da un setter personalizzato per la vostra proprietà geoPoint - in questo modo si è garantito che accadrà quando il controller della vista avrà i dati appropriati, che saranno ancora prima che appaia, quindi non ci sarà una transizione visibile della mappa.

+0

Hai ragione, il 'geoPoint' è impostato in un' prepareForSegue: sender: 'da un altro controller. Tuttavia, chiamare il 'centerMapView' da un inizializzatore personalizzato a' geoPoint' non è stato d'aiuto. Registro la latitudine e la longitudine di 'geoPoint' nel mio' centerMapView' ed è sempre impostato sul valore corretto, anche se chiamato da 'viewDidLoad'. –