5

我有一个带有 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没有任何作用,但在第二次加载视图时将其正确居中。日志输出始终为:

size height: 0.000000
size width: 0.000000

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

size height: 400.000000
size width: 320.000000

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

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

有什么建议吗?

4

1 回答 1

0

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

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

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

于 2012-12-24T19:54:16.593 回答