2012-12-24 12 views
5

Tôi có một ViewController với một MapView, bộ điều khiển được khởi tạo bởi một khoảng cách được chỉ định trong bảng phân cảnh. MapView được kết nối (thông qua Storyboard) đến một thuộc tính trong bộ điều khiển.MKMapView và viewDidLoad/viewWillAppear/viewDidAppear sử dụng Storyboards


.h tập tin

@interface DetailViewController : UIViewController <MKMapViewDelegate> 

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

Tôi đang sử dụng một phương pháp để tập trung các MapView đến một khu vực cụ thể:

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

gọi method này từ viewDidLoad/viewWillAppear không làm gì cho lần đầu tiên thời gian, nhưng trung tâm nó một cách chính xác cho lần thứ hai xem được nạp. Sản lượng Log luôn là:

size height: 0.000000 
size width: 0.000000 

Khi được gọi trong viewDidAppear các MapView tập trung và kích thước đầu ra là chính xác:

size height: 400.000000 
size width: 320.000000 

Tôi đoán các giá trị kích thước có nghĩa là quan điểm vẫn chưa được khởi tạo trong viewDidLoad/viewWill xuất hiện, điều này có thể không liên quan đến vấn đề của tôi khi thiết lập khu vực.

Tôi tự hỏi, nếu thực sự không thể thiết lập vùng của MapView trong viewDidLoad/viewWillAppear để người dùng không thấy sự thay đổi của khu vực.

Bạn có lời khuyên nào không?

+0

Bạn có nói rằng bạn đã thử tính năng này trong chế độ xemLàm đẹp hơn không? Nếu không, hãy thử nó ở đó. –

+0

Tôi đã thử mà không thành công –

Trả lời

0

Vấn đề về kích thước chế độ xem có thể không liên quan đến vấn đề của bạn với việc đặt khu vực.

Câu hỏi quan trọng: khi nào là DetailViewController 's geoPoint thuộc tính được đặt, có liên quan đến thời điểm xem được tải không? Nếu viewDidLoad chạy trước khi bạn đặt thuộc tính đó (có lẽ là từ prepareForSegue:sender: trong bộ điều khiển chế độ xem khác), geoPoint sẽ là 0 (không) khi bạn cố căn giữa bản đồ, vì vậy nó sẽ không căn giữa nó. (Và nó hoạt động lần thứ hai vì trường hợp của DetailViewController đã tồn tại và có nó geoPoint từ thời gian trước đó.)

Bạn có thể cân nhắc việc gọi phương thức centerMapView của bạn từ một setter tùy chỉnh cho bất động sản geoPoint của bạn - đó là cách bạn đảm bảo rằng nó sẽ xảy ra khi bộ điều khiển chế độ xem có dữ liệu thích hợp, dữ liệu này vẫn sẽ xuất hiện trước khi nó xuất hiện để không có chuyển đổi bản đồ hiển thị.

+0

Bạn nói đúng, 'geoPoint' được đặt trong' preparForSegue: sender: 'từ một bộ điều khiển khác. Tuy nhiên, việc gọi 'centerMapView' từ trình khởi tạo tùy chỉnh thành' geoPoint' không giúp được gì. Tôi đăng nhập vĩ độ và kinh độ của 'geoPoint' trong' centerMapView' của tôi và nó luôn được đặt thành giá trị đúng, ngay cả khi được gọi từ 'viewDidLoad'. –