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