使用Storyboard的MKMapView和viewDidLoad / viewWillAppear / viewDidAppear

时间:2012-12-24 18:47:06

标签: objective-c ios mkmapview

我有一个带有MapView的ViewController,控制器由故事板中指定的segue初始化。 MapView连接(通过Storyboard)到控制器中的属性。


.h文件

@interface DetailViewController : UIViewController <MKMapViewDelegate>

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

我正在使用一种方法将MapView集中到特定区域:

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

首次从viewDidLoad / viewWillAppear调用此方法不会执行任何操作,但会在第二次加载View时正确居中。 日志输出始终为:

size height: 0.000000
size width: 0.000000

viewDidAppear中调用时,MapView居中且输出大小正确:

size height: 400.000000
size width: 320.000000

我想大小值意味着视图尚未在viewDidLoad / viewWill中初始化,这可能与我设置区域的问题无关。

我想知道,如果真的无法在viewDidLoad / viewWillAppear中设置MapView的区域,那么用户就不会看到区域的更改。

有什么建议吗?

1 个答案:

答案 0 :(得分:0)

视图大小问题可能与您设置区域的问题无关。

关键问题:何时设置DetailViewController的{​​{1}}属性,相对于其视图加载的时间?如果geoPoint在您设置该属性之前运行(可能来自另一个视图控制器中的viewDidLoad),那么当您尝试将地图居中时,prepareForSegue:sender:将为零(零),因此它不会正确地居中。 (并且它第二次起作用,因为geoPoint的实例已经存在且前一次具有DetailViewController。)

您可以考虑从geoPoint属性的自定义设置器中调用centerMapView方法 - 这样您就可以确保一旦视图控制器具有相应的数据就会发生这种情况,仍然在它出现之前,所以不会有可见的地图过渡。