当从MKUserTrackingModeFollowWithHeading切换模式时,如何在iOS 6中保持MKMapView北向

时间:2013-04-13 05:13:23

标签: iphone ios objective-c mkmapview android-mapview

我正在使用mapMKUserTrackingModeNoneMKUserTrackingModeFollow在三种不同的MKUserTrackingModeFollowWithHeading定位模式之间切换,这是有效的。

但是,当从MKUserTrackingModeFollowWithHeading切换到MKUserTrackingModeNone时,我的地图方向没有重置为朝北方向(地图北侧位于屏幕顶部)。 / p>

iphone/ipad上的内置地图应用中,流程如下:

启动应用程序时,它处于模式MKUserTrackingModeNone并且面向北方 当你切换方向模式时,它会变为MKUserTrackingModeFollow,方向仍然是北方。

再次切换时,它会变为MKUserTrackingModeFollowWithHeading,地图会根据您面向/指向iPhone的方向旋转。

再次切换方向时,它会返回MKUserTrackingModeNone,地图会很好地旋转回北方。

我希望我的应用在切换模式时的方向相同,但是当我执行上面的步骤4并从MKUserTrackingModeFollowWithHeading切换到MKUserTrackingModeNone时,方向保持为它就在制作方向开关之前,而不是向北旋转。

我正在制作方向开关,并在工具栏中放置标准MKUserTrackingBarButtonItem控件。

任何人都可以帮我解决这个问题吗?

3 个答案:

答案 0 :(得分:1)

我也在运行iOS 6.1.4的iPhone 5上遇到此问题。我使用这个简单但丑陋的快速修复来强制地图视图旋转回北向:

-(void)someMethod
{
    // Currently in MKUserTrackingModeFollowWithHeading mode

    // Set tracking mode back to MKUserTrackingModeFollow
    [_mapView setUserTrackingMode:MKUserTrackingModeFollow];

    // After a short delay, set mode to MKUserTrackingModeNone
    [self performSelector:@selector(mapViewTrackingModeNone)
               withObject:nil
               afterDelay:0.2];

}

- (void)mapViewTrackingModeNone
{
    [_mapView setUserTrackingMode:MKUserTrackingModeNone];

    // Bang! The map rotates back to North-Up
}

这可能有更好的方法,但我还没有找到它。

答案 1 :(得分:0)

在iOS 5中,它将为您切换为北,但在iOS 6中它不会。您可以在bugreport.apple.com上提交增强请求。

您可以实现委托回调函数并在委托回调中应用循环...

- (void)mapView:(MKMapView *)mapView didChangeUserTrackingMode:(MKUserTrackingMode)mode animated:(BOOL)animated
{
    if (mode == MKUserTrackingModeNone)
        [self rotateTheMapView];
}

- (void)rotateTheMapView {
    // See https://stackoverflow.com/q/1245461/1445366
}

(有关轮换说明和代码,请参阅Rotate MapView using Compass orientation。)

问题在于Apple没有使用其内部逻辑公开当前的精确旋转,因此iOS提供给您的当前标题的任何计算都可能稍微偏离,导致您的地图在您'时稍微偏离北方重做。

答案 2 :(得分:0)

你应该把一个小的测试应用程序放在一起,它只有一个mapview和一个MKUserTrackingBarButtonItem并将两者连接在一起。如果它应该如您所描述的那样,并且不需要一行代码。所有连接都可以在IB中完成。一旦看到它工作,您就可以返回代码并重复此过程。