Ios 首次尝试时未显示Mapkit mapview

Ios 首次尝试时未显示Mapkit mapview,ios,mkmapview,mapkit,Ios,Mkmapview,Mapkit,我在RootViewController.m上有一个选项卡。该选项卡有两个按钮。单击后的第一个按钮将转到带有地图视图的CorpViewcontroller。当我第一次点击第一个按钮时,地图是空白的,底部有谷歌标签。我必须单击后退,然后再次单击按钮,然后地图就会显示出来。是否可以始终在第一次单击按钮时显示地图 My rootViewController.m转到第二个屏幕: [self.navigationController pushViewController:self.corpContro

我在RootViewController.m上有一个选项卡。该选项卡有两个按钮。单击后的第一个按钮将转到带有地图视图的CorpViewcontroller。当我第一次点击第一个按钮时,地图是空白的,底部有谷歌标签。我必须单击后退,然后再次单击按钮,然后地图就会显示出来。是否可以始终在第一次单击按钮时显示地图

My rootViewController.m转到第二个屏幕:

  [self.navigationController pushViewController:self.corpController animated:YES];
第二个名为corpViewController的屏幕具有以下代码:

  - (void)viewDidLoad
  {
    [super viewDidLoad];

    self.title = @"Set Remote Location";
    self.jsonData = [[NSMutableData alloc] init];

    mapView.showsUserLocation = YES;

    //Setup the double tap gesture for getting the remote location..
    UITapGestureRecognizer *tgr = [[UITapGestureRecognizer alloc] 
                               initWithTarget:self action:@selector(handleGesture:)];
    tgr.numberOfTapsRequired = 2;
    tgr.numberOfTouchesRequired = 1;
    [mapView addGestureRecognizer:tgr];

    mapView.delegate = self;

    NSLog(@"viewDidLoad  done");
    }


    - (void)viewWillAppear:(BOOL)animated    {

      NSLog(@"viewWillAppear");

      appDelegate = (NBSAppDelegate *)[[UIApplication sharedApplication] delegate];

      double curLat = [appDelegate.curLat doubleValue];

      MKUserLocation *userLocation = mapView.userLocation;

      double miles = 10.0;
      double scalingFactor = ABS( (cos(2 * M_PI * curLat / 360.0) ));

      MKCoordinateSpan span; 

      span.latitudeDelta = miles/69.0;
      span.longitudeDelta = miles/(scalingFactor * 69.0); 

      MKCoordinateRegion region2;
      region2.span = span;
      region2.center = userLocation.coordinate;

      [mapView setRegion:region2 animated:YES];

       NSLog(@"viewWillAppear done..");

       }
请告知


谢谢

viewdiload
中,您正在将
showsUserLocation
设置为
YES
,并且在
视图中将出现
中,您正在缩放到
地图视图.userLocation
坐标

showsUserLocation
设置为
YES
后,
userLocation
属性通常不会立即准备好有效坐标

第一次显示视图控制器时,它仍然无效,并且正在缩放到坐标0,0

第二次显示视图控制器时,已获得用户位置,坐标有效

在代理方法
mapView:didUpdateUserLocation:
中执行此操作,而不是在
视图中将显示缩放到用户位置,地图视图在获取用户位置更新时会调用该方法

此外,您可能还希望移动
mapView.showsUserLocation=YES
视图将出现
,在
视图中将消失
,将其设置为
。这样,地图视图将在每次显示视图控制器时放大到用户位置,而不仅仅是第一次


一个不相关的点是,要放大到特定距离,使用
MKCoordinateRegionMakeWithDistance
功能比自己尝试将英里转换为度要容易得多


以下是
corpViewController
中建议的更改示例:

- (void)viewWillAppear:(BOOL)animated
{
    //move this from viewDidLoad to here...
    mapView.showsUserLocation = YES;
}

-(void)viewWillDisappear:(BOOL)animated
{
    mapView.showsUserLocation = NO;
}

-(void)mapView:(MKMapView *)mv didUpdateUserLocation:(MKUserLocation *)userLocation
  //Changed the **internal** parameter name from mapView to mv
  //to avoid a compiler warning about it hiding instance var with same name.
  //It's better to use the passed parameter variable anyway.
{
    NSLog(@"didUpdateUserLocation");

    double miles = 10.0;

    //Instead of manually calculating span from miles to degrees, 
    //use MKCoordinateRegionMakeWithDistance function...
    //Just need to convert miles to meters.
    CLLocationDistance meters = miles * 1609.344;
    MKCoordinateRegion region2 = MKCoordinateRegionMakeWithDistance
                                   (userLocation.coordinate, meters, meters);

    [mv setRegion:region2 animated:YES];
}

是否在视图控制器的
viewDidLoad
方法中初始化MapView


如果是,请尝试将其移动到
viewdideappear
方法。这对我很管用。

第一次单击时,地图都是蓝色的吗?如果注释掉视图中的setRegion行,会发生什么?是,贴图全部为蓝色。如果我注释掉了setRegion,我现在在第一次尝试时确实看到了地图,但它没有在当前位置10英里内放大。有什么建议吗?要使setRegion在第一次尝试时起作用,我将mapView.showUserLocation=YES移动到ViewWillDisplay,并在ViewWillEnglish中将其设置为NO,但在第一次尝试时的行为仍然是蓝色屏幕。我输入了didUpdateUserLocation,但它从未接到电话。我将尝试使用距离设置MKCoordinateRegionMakeWithDistance,看看它是否有帮助-thx确保您仍然在viewDidLoad中设置代理。显示您的didUpdateUserLocation方法(将代码添加到问题中)。是的,我在ViewDidLoad中仍有该委托,并且ViewDidLoad中不会显示任何内容。将所有代码移到didUpdateUserLocation中。在第一次尝试中,我确实看到了美国地图。但是didUpdateUserLocation从未得到调用,因此,它没有放大。请显示您的didUpdateUserLocation方法。请注意,获取位置可能仍需要几秒钟。您是否在模拟器中打开了位置?还要实现“didFail”方法,看看它是否被调用。但是如果您显示编写的didUpdate方法,则会有所帮助。-(void)mapView:didUpdateUserLocation{NSLog(@“In didUpdateUserLocation..);mapView.showsUserLocation=YES;appDelegate=(NBSAppDelegate*)[[UIApplication sharedApplication]delegate]delegate];double curLat=[appDelegate.curLat doubleValue];MKUserLocation*userLocation=mapView.userLocation;