Ios 在MKUSERTRACKINGMODE FOLLOWWITHHEADING map mode中设置MKMapCamera时,MKMapView的奇怪行为

Ios 在MKUSERTRACKINGMODE FOLLOWWITHHEADING map mode中设置MKMapCamera时,MKMapView的奇怪行为,ios,iphone,cocoa-touch,mkmapview,mapkit,Ios,Iphone,Cocoa Touch,Mkmapview,Mapkit,在使用MKMapView和MKMapCamera时,我注意到了奇怪的行为。我需要实现苹果地图应用程序的一些标准行为。基本上,当地图视图的用户跟踪模式设置为MKUserTrackingModeFollowWithHeading时,我需要能够在2D和3D模式之间切换 目前,当userTrackingMode设置为MKUserTrackingModeNone时,我的解决方案可以正常工作,但在其他模式下它会产生奇怪的动画(无论我设置Camera:animated:是还是否,都会发生这种情况)。 当我在设

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

目前,当userTrackingMode设置为MKUserTrackingModeNone时,我的解决方案可以正常工作,但在其他模式下它会产生奇怪的动画(无论我设置Camera:animated:是还是否,都会发生这种情况)。 当我在设置新的前后记录相机参数时,唯一的区别就是音高的变化

另一个问题是改变相机的高度以编程方式放大或缩小。我试着用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
我要寻找的是类似于苹果地图应用程序的行为。
你有什么想法吗?我做错了什么?

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

请参阅(MapKit:用户跟踪期间的编程缩放)和(MKUserTrackingModeFollow禁止在边缘进行注释选择)


我的建议是:避免使用MKUserTrackingModeFollow和MKUserTrackingModeFollow with heading,只要您希望对显示的地图区域进行编程控制。

iOS9更新

它有同样的效果:“高度稍微缩小了一点”

但这种效应只有在

[self.mapView setCamera:newCamera animated:NO];

使用
*动画时没有:是的*

我也向苹果提交了一份bug报告,这是一个非常恼人的bug。我有一个可能的解决办法。我有一个单例位置管理器,使用CLLocationManagerDelegate,我使用NSNotifications订阅位置更新,每次使用MKCamera将地图居中,使其“看起来”跟随用户。这样,您仍然可以控制缩放并在用户身上定位地图。当然,我也做了类似的解决方法。然而,它不是完全相同的用户体验。滚动不是那么平滑(因为我们不能调整动画的持续时间),手动旋转指南针时地图的旋转也是如此。是的,这真的很令人沮丧。苹果需要开始他们的游戏。2016年,iOS9。仍然是一个bug。@VisionMkhabela文档在我看来仍然非常不清楚。问题本身仍然存在。截至2017年,这种情况仍然存在。您确定设置了MKUserTrackingModeFollowWithHeading吗?