iOS旋转MKAnnotationView以响应MKMapView旋转

时间:2011-09-27 20:54:45

标签: iphone ios map mkmapview mkannotation

在我的应用程序中,我有一个MKMapView,其中显示了几个注释。地图根据设备的标题旋转。要旋转地图,将执行以下语句(由方法locationManager调用:didUpdateHeading:)

self.navigationMapView.mapView.transform = CGAffineTransformMakeRotation(-heading);

其中航向(磁性)以弧度表示。我注意到的是,即使地图中的注释也会旋转,我也不想要它。我尝试用以下方法修复它:

- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation{

    static NSString *identifier = @"AnnotationViewIdentifier";

    MKAnnotationView *av = [mapView dequeueReusableAnnotationViewWithIdentifier:identifier];

    if (av == nil) {
        av = [[[MKPinAnnotationView alloc]initWithAnnotation:annotation reuseIdentifier:identifier] autorelease];
    }
    else{
        av.annotation = annotation;
    }

    av.transform = CGAffineTransformMakeRotation(degreesToRadians(self.arController.currentHeading.magneticHeading)); 

    av.canShowCallout = YES;
    return av;

} 

我想从“didUpdateHeading:”调用此方法,但我真的不知道该怎么做。 TableView类具有调用委托方法的reloadData函数,但这里的东西看起来不同。有什么建议?!

另一个问题,我在地图上的注释显示了与用户的距离,我想在用户更改位置时立即更新它们(距离标签)。有什么建议吗?!

1 个答案:

答案 0 :(得分:1)

因此,使用正确调用的MKMapView有点烦人。基本上你有两种选择之一。选项1:在屏幕上创建注释数组,并从map_view中删除它,然后将它们重新添加到map_view。基本上创建自己的重载数据功能。选项2:做一些简单的事情,比如

CGLocationCoordinate2D coordinate = map_view.center;
 map_view.center = coordinate;

- 基本上重点是重置地图的属性,使其重绘。但是,此选项并不总是有效。选项1具有更高的工作机会,但是也可以失败,所以如果简单地取消注释并重新添加它们就不会发生任何事情,那么只需简单地减少地图然后在地图刷新功能结束时重新创建地图等。

[my_map_view removeFromSuperView];
[my_map_view release];
my_map_view = nil;
my_map_view = [[MKMapView alloc] initWithFrame:CGRectMake(0,0,320,480)];

其中一个选项应该有用。我必须为我的解决方案选择一个,但我知道有些人很幸运,选项2也可以。