使用Storyboard的MKMapView和viewDidLoad/viewWillAppear/viewDidAppear

Chr*_*ite 5 objective-c mkmapview ios

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


.h文件

@interface DetailViewController : UIViewController <MKMapViewDelegate>

@property (weak, nonatomic) IBOutlet MKMapView *locationMapView;
Run Code Online (Sandbox Code Playgroud)

我正在使用一种方法将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);
}
Run Code Online (Sandbox Code Playgroud)

从第一次调用此方法viewDidLoad/ viewWillAppear什么都不做,但第二次加载视图时正确居中.日志输出始终为:

size height: 0.000000
size width: 0.000000
Run Code Online (Sandbox Code Playgroud)

viewDidAppearMapView中调用时居中并且输出大小正确:

size height: 400.000000
size width: 320.000000
Run Code Online (Sandbox Code Playgroud)

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

我想知道,如果真的不可能在viewDidLoad/中设置MapView的区域,viewWillAppear那么用户看不到区域的变化.

有什么建议?

ric*_*ter 0

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

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

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