【问题标题】:MKMapView and viewDidLoad/viewWillAppear/viewDidAppear using StoryboardsMKMapView 和 viewDidLoad/viewWillAppear/viewDidAppear 使用 Storyboard
【发布时间】:2012-12-11 01:50:58
【问题描述】:

我有一个带有 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

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

size height: 400.000000
size width: 320.000000

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

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

有什么建议吗?

【问题讨论】:

  • 你说你在 viewWillAppear 中也试过这个吗?如果没有,请在那里尝试。
  • 我确实尝试过,但没有成功

标签: objective-c ios mkmapview


【解决方案1】:

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

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

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

【讨论】:

  • 你是对的,geoPoint 设置在另一个控制器的prepareForSegue:sender: 中。但是,从自定义初始化程序调用 centerMapViewgeoPoint 并没有帮助。我在centerMapView 中记录了geoPoint 的纬度和经度,它始终设置为正确的值,即使从viewDidLoad 调用也是如此。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-05-27
  • 1970-01-01
  • 2012-08-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多