在MKUserTrackingModeFollowWithHeading地图模式下设置MKMapCamera时奇怪的MKMapView行为

时间:2013-10-26 12:21:46

标签: ios iphone cocoa-touch mkmapview mapkit

我在使用MKMapView和MKMapCamera时注意到了奇怪的行为。我需要实现一些Apple Maps应用程序的标准行为。基本上,当Map View的用户跟踪模式设置为 MKUserTrackingModeFollowWithHeading 时,我需要能够在2D和3D模式之间切换。

目前,我的解决方案在userTrackingMode设置为 MKUserTrackingModeNone 时工作正常,但它在其他模式下执行奇怪的动画(无论我使用setCamera:动画:是或否)都会发生这种情况。 当我在设置new之前和之后记录相机参数时,唯一的区别是我的音高变化。

另一个问题是改变相机的高度以便以编程方式放大或缩小。我试图在IBAction方法中使用捏合或缩小手势来模仿缩放。在 followWithHeadingMode 地图中,始终返回“默认”缩放级别(摄像机的高度),而在其他模式下效果很好。

我启动了示例项目以检查发生了什么,这是我的单视图应用程序的视图控制器,带有地图视图,其中出现问题:

#import "CCViewController.h"

@interface CCViewController ()
@end

@implementation CCViewController

- (void)viewDidLoad{
    [super viewDidLoad];
}

- (void)setUpMap{
    [self.mapView setShowsUserLocation: YES];
}

- (void)viewDidAppear:(BOOL)animated{
    [self setUpMap];
}

- (IBAction)mapModeSwitchClicked:(id)sender {
    MKMapCamera *newCamera = [MKMapCamera camera];
    newCamera.centerCoordinate = self.mapView.camera.centerCoordinate;
    newCamera.heading = self.mapView.camera.heading;
    newCamera.altitude = self.mapView.camera.altitude;

    if(!self.mapView.camera.pitch){
        newCamera.pitch = 50;
        self.mapModeSwitch.title = @"2D";
    }
    else{
        newCamera.pitch = 0;
        self.mapModeSwitch.title = @"3D";
    }

    [self.mapView setCamera:newCamera animated:YES];
}

- (IBAction)locateMeButtonClicked:(id)sender {

        if(self.mapView.userTrackingMode != MKUserTrackingModeFollowWithHeading)
            [self.mapView setUserTrackingMode:MKUserTrackingModeFollowWithHeading animated:YES];
        else
            [self.mapView setUserTrackingMode:MKUserTrackingModeNone animated:YES];
}

- (void)zoomMapWithZoomFactor:(double)factor{
    MKMapCamera *newCamera = [MKMapCamera camera];
    newCamera.pitch = self.mapView.camera.pitch;
    newCamera.heading = self.mapView.camera.heading;
    newCamera.altitude = self.mapView.camera.altitude * factor;
    newCamera.centerCoordinate = self.mapView.camera.centerCoordinate;

    [self.mapView setCamera:newCamera animated:YES];
}

- (IBAction)zoomInClicked:(id)sender {
    [self zoomMapWithZoomFactor: 0.5];
}

- (IBAction)zoomOutClicked:(id)sender {
     [self zoomMapWithZoomFactor: 2];
}


@end

我正在寻找的是与Apple Maps应用类似的行为。 你有什么想法?我做错了什么?

2 个答案:

答案 0 :(得分:5)

我相信这是MapKit中的一个错误。我使用程序化缩放进行了类似的观察,同时启用了MKUserTrackingModeFollowWithHeading:地图很快缩小,但在收到下一个位置更新后立即返回到上一个缩放级别。

请参阅rdar://15374402(MapKit:用户跟踪期间的程序化缩放)和rdar://15374604(MKUserTrackingModeFollow禁止边缘处的注释选择)。

我的建议:只要您想要对显示的地图区域进行编程控制,请避免使用MKUserTrackingModeFollow和MKUserTrackingModeFollowWithHeading。

答案 1 :(得分:1)

iOS9更新

它具有相同的效果:"海拔高度缩小了一点"

但这种效果只在

发生时才会发生
unlist

不是在使用[self.mapView setCamera:newCamera animated:NO];