2012-12-24 58 views
5

我有一個帶有MapView的ViewController,控制器通過在故事板中指定的segue進行初始化。 MapView通過Storyboard連接到控制器中的一個屬性。MKMapView和viewDidLoad/viewWillAppear/viewDidAppear使用故事板


.h文件中

@interface DetailViewController : UIViewController <MKMapViewDelegate> 

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

我使用的方法的MapView中心到特定區域:從viewDidLoad/viewWillAppear

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

調用此方法不做任何事爲先時間,但第二次加載視圖時將其居中。 日誌輸出始終是:

size height: 0.000000 
size width: 0.000000 

viewDidAppear所謂的MapView爲中心和輸出尺寸是正確的:

size height: 400.000000 
size width: 320.000000 

我猜大小值意味着該視圖尚未初始化出現viewDidLoad/viewWill,這可能與我在設置區域時遇到的問題無關。

我在想,如果真的不可能在viewDidLoad/viewWillAppear中設置MapView的區域,所以用戶看不到區域的變化。

有什麼建議嗎?

+0

你是否說過你在viewWillAppear中試過這個?如果沒有,請在那裏嘗試。 –

+0

我確實嘗試過,但沒有成功 –

回答

0

視圖大小問題可能與您在設置區域時遇到的問題無關。

關鍵問題:何時是DetailViewControllergeoPoint屬性設置,相對於其視圖何時被加載?如果viewDidLoad在您設置該屬性之前運行(可能從另一個視圖控制器中的prepareForSegue:sender:),則當您嘗試居中地圖時,geoPoint將爲零(零),因此它不會正確居中。 (和它的作品第二次因爲DetailViewController實例已經存在,有其geoPoint從以前的時間)。

您可以考慮呼喚你從定製的setter方法centerMapView爲您geoPoint屬性 - 這樣你保證一旦視圖控制器具有適當的數據就會發生,這些數據在出現之前仍然存在,因此不會出現可見的地圖轉換。

+0

你是對的,'geoPoint'設置在另一個控制器的'prepareForSegue:sender:'中。 但是,從自定義初始值設定項調用'centerMapView'到'geoPoint'沒有幫助。我在'centerMapView'中記錄了'geoPoint'的經度和緯度,並且它始終設置爲正確的值,即使從'viewDidLoad'調用。 –