无法将MapKit用户坐标转换为屏幕坐标

这其实是一个线程中三个不同的问题:

1)我正在使用:

- (void)viewDidLoad { [super viewDidLoad]; [mapView setFrame :CGRectMake(-100,-100,520,520)]; [mapView setAutoresizesSubviews:true]; mapView.showsUserLocation = YES; locManager = [[CLLocationManager alloc] init]; locManager.delegate = self; [locManager startUpdatingLocation]; [locManager startUpdatingHeading]; [bt_toolbar setEnabled:YES]; } - (IBAction) CreatePicture { CLLocationCoordinate2D coord = CLLocationCoordinate2DMake(mapView.userLocation.coordinate.latitude, mapView.userLocation.coordinate.longitude); CGPoint annPoint = [self.mapView convertCoordinate:coord toPointToView:self.mapView]; mapPic = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"pic.png"]]; mapPic.frame = CGRectMake(annPoint.x, annPoint.y, 32, 32); [self.view addSubview:macPic]; } 

使用GCRectMake在用户的坐标上放置一个图像,但遗憾的是图像没有放置在正确的位置:

坐标转换出错了

如果我移动地图,图片将始终放置在与用户位置完全相同的位置。 我错过了什么? 它不应该直接放在用户的上面吗? 我猜的偏移量(-100,-100)我给了mapView首先是什么原因造成这个(我有一个工具栏下面,因此偏移量)。

2)我的iOS 5模拟器疯狂地把我的位置放在凤凰城的格伦代尔(不应该是在库比蒂诺??)出于某种原因,并且正在向东移动; 一切工作正常,但我的iPhone 4(除了不正确的位置的图片)。 有任何想法吗?

3)我一直在考虑使用Annotations,但是我听说他们是静态的(我真的需要dynamic的)。 这是真的?

谢谢!

当添加一个子视图时,它的框架原点是相对于它的超视图的。 在这种情况下,您从地图视图派生了一个起点,然后将该图像添加到视图控制器的视图中。 您需要将图像的原点转换为self.view的坐标系,如下所示:

 CGPoint imageOrigin = [self.view convertPoint:annPoint fromView:self.mapView]; mapPic.frame.origin = imageOrigin; [self.view addSubview:macPic]; 

注意:这是未经testing的代码,但主要是你需要在mapView的坐标空间(这是你从[self.mapView convertCoordinate:coord toPointToView:self.mapView]得到的)到self.view的坐标空间之间进行转换。 这个例子有点像人为的说明,因为更简单的方法是首先使用self.view的坐标空间:

 CGPoint annPoint = [self.mapView convertCoordinate:coord toPointToView:self.view]; 

我想你会更好的使用自定义的MKPinAnnotationView使用自己的图像。 根据这个答案。 在MKPinAnnotationView后面添加图像

MKMapView提供了在视图空间和地理坐标之间转换的以下方法:

 – convertCoordinate:toPointToView: – convertPoint:toCoordinateFromView: – convertRegion:toRectToView: – convertRect:toRegionFromView: 

这些对于将触摸转换为地图坐标的任务是很好的。 对于你描述的任务,我认为地图叠加比使用子视图在地图上绘制更合适。 覆盖图是一种注释,它允许您绘制任何您喜欢的内容,但是可以让地图确定叠加层何时可见并且需要绘制。

3)我一直在考虑使用Annotations,但是我听说他们是静态的(我真的需要dynamic的)。 这是真的?

这里“静态”与“dynamic”是什么意思? 你的意思是你想改变覆盖视图中的内容吗? 或者你想改变覆盖层本身的位置? 我认为应该可以根据需要更新覆盖视图。 我不确定是否可以通过简单地调整它的boundingMapRect属性来移动覆盖图,但我希望能够工作。 如果没有,您可以随时删除叠加层并重新添加。

尝试创build自己的地图叠加系统而不是使用MapKit提供的工具应该是您的选项列表中的最后一件事。 如果您可以使用框架而不是使用框架,生活总是更容易,并且您的代码在未来不太可能破解。