ios - 在 MKUserTrackingModeFollowWithHeading map 模式下设置 MKMapCamera 时奇怪的 MKMapView 行为

标签 ios iphone cocoa-touch mkmapview mapkit

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

目前,当 userTrackingMode 设置为 MKUserTrackingModeNone 时,我的解决方案工作正常,但它在其他模式下会出现奇怪的动画(无论我 setCamera: animated:YES 还是 NO,它都会发生)。 当我在设置新的之前和之后记录相机参数时,唯一的区别是我的音高变化。

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

我开始了示例项目来检查发生了什么,这是我的单 View 应用程序的 View Controller 和发生问题的 map View :

#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 map 应用程序的行为。 你有什么想法?我做错了什么?

最佳答案

我相信这是 MapKit 中的一个错误。我在启用 MKUserTrackingModeFollowWithHeading 时通过编程缩放进行了类似的观察: map 很快缩小,但在收到下一个位置更新后立即返回到之前的缩放级别。

参见 rdar://15374402 (MapKit:在 UserTracking 期间进行编程缩放)和 rdar://15374604 (MKUserTrackingModeFollow 禁止在边缘进行注解选择)。

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

关于ios - 在 MKUserTrackingModeFollowWithHeading map 模式下设置 MKMapCamera 时奇怪的 MKMapView 行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19606648/

相关文章:

ios - 在 NSCache 中存储结构的任何方式

objective-c - __attribute__ ((deprecated)) 不适用于 objective-c 协议(protocol)方法?

iphone - 比较 NSDates 以确定白天还是晚上?

iphone - OpenGL ES [CAEAGLLayer] 内容的高分辨率视网膜显示屏幕截图

ios - 这是 iOS 中的 Controller

objective-c - NSOperationQueue 指定线程

ios - 使用 AVPlayer 流式传输视频时调整质量

ios - 使用 Xcode LLDB 控制台在 Swift 中调试闭包

ios - 向以编程方式添加的 subview 添加右对齐约束

iphone - iOS 上的页面 curl