Iphone 将MapKit用户坐标转换为屏幕坐标时出现问题

Iphone 将MapKit用户坐标转换为屏幕坐标时出现问题,iphone,ios,ios5,ios-simulator,mapkit,Iphone,Ios,Ios5,Ios Simulator,Mapkit,好的,这实际上是一个线程中的三个不同问题: 1) 我正在使用: - (void)viewDidLoad { [super viewDidLoad]; [mapView setFrame :CGRectMake(-100,-100,520,520)]; [mapView setAutoresizesSubviews:true]; mapView.showsUserLocation = YES; locManager = [[CLLocationManage

好的,这实际上是一个线程中的三个不同问题:

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在用户坐标上放置图像,但遗憾的是图像没有放置在正确的位置:

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

2) 我的iOS 5模拟器表现得很疯狂,出于某种原因把我的位置放在凤凰城的格伦代尔(它不应该在库比蒂诺吗??),就像我在向东移动一样;但在我的iPhone4中一切都很好(除了图片的位置不正确)。有什么想法吗

3) 我一直在考虑改用注释,但我听说它们是静态的(我真的需要动态的)。这是真的吗


谢谢

我认为您最好使用自定义的MKPinAnnotationView,使用您自己的图像。 根据这个答案。

添加子视图时,其帧原点相对于其superview的帧原点。在本例中,您从地图视图衍生出一个原点,然后将图像添加到视图控制器的视图中。您需要将图像的原点转换为self.view的坐标系,如下所示:

CGPoint imageOrigin = [self.view convertPoint:annPoint fromView:self.mapView];
mapPic.frame.origin = imageOrigin;
[self.view addSubview:macPic];
注意:这是一段未经测试的代码,但主要是需要在地图视图的坐标空间(这是从[self.mapView convertCoordTopointToView:self.mapView]获得的坐标空间)与self.view的坐标空间之间进行转换。这个例子有点像是说明性的,因为更简单的方法是首先使用self.view的坐标空间:

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

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

– convertCoordinate:toPointToView:
– convertPoint:toCoordinateFromView:
– convertRegion:toRectToView:
– convertRect:toRegionFromView:
这对于将触摸转换为地图坐标这样的任务非常有用。对于您描述的任务,我认为地图覆盖比使用子视图在地图上绘制更合适。覆盖是一种注释,允许您绘制任何您喜欢的内容,但让地图负责确定覆盖何时可见以及何时需要绘制

3) 我一直在考虑改用注释,但我听说 它们是静态的(我真的需要它们是动态的)。这是真的吗

你说的“静态”和“动态”是什么意思?您的意思是要更改覆盖视图中的内容吗?还是要更改覆盖本身的位置?我认为应该可以根据需要随时更新覆盖视图。我不确定您是否可以通过简单地调整它的
boundingMapRect
属性来移动覆盖,但我希望这会起作用。如果没有,您始终可以删除覆盖层并再次添加


尝试创建自己的地图覆盖系统而不是使用MapKit提供的工具应该是选项列表中的最后一件事。如果您可以使用框架而不是使用框架,那么生活就会变得更轻松,而且您的代码在将来也不太可能被破坏。

您是否可以包括将mapPic添加到视图层次结构中的部分?听起来您可能正在使用mapView的坐标系,但将mapPic放置在具有不同坐标系的superview(可能是视图控制器的视图)中。您好,谢谢您的回复。这是一个简单的addSubView,刚刚添加了它;更具体地说,我想让它移动到一组坐标(因此是整个动态与静态的问题)。另一件事:地图覆盖不是有点限制,比如只限于绘制多边形吗?我能用它们把图像放到地图上吗?最后一件事:@kalperin的回答对主要问题起到了关键作用,但因为我实际上问了三个问题,所以你也得到+50代表是公平的。我们怎样才能做到这一点,我应该重复这个问题,给你发送链接,你回答,我给你+50吗?@Hal不,你可以在叠加图中画你喜欢的任何东西。MKOVERYVIEW文档中:“您可以将MKOVERYVIEW子类化,以基于自定义形状和内容创建覆盖图。”MapKit中提供了一些绘制多边形和多段线的子类,但您不限于此。我注意到MKOverlay的
boundingMapRect
标记为
readonly
,因此我不知道地图是否会注意到更改,但同样,您可以从地图中删除它,更改它,然后再添加它。我怀疑用户是否会注意到。@Hal我很感激考虑到w.r.t.奖金,但不用担心。我鼓励你尝试覆盖,因为我相信这是一个更好的解决方案,但你应该选择一个“正确”的答案,并根据你认为最好的答案奖励任何奖金。奖金就是——很高兴得到,而不是期望得到的东西。(谁知道呢?你可能会得到更好的答案。)祝你好运。这不是一个精确的匹配(图像不会完全覆盖蓝点),但它会。谢谢你的介绍!:)图像的左上角是否与蓝点的中心对齐?尝试将图像视图居中于该点上。它确实(对齐)。是否可以将图像的中心而不是左上角对齐?如果是,怎么做?