【问题标题】:How to keep MKMapView in iOS 6 North oriented always when switching mode from MKUserTrackingModeFollowWithHeading从 MKUserTrackingModeFollowWithHeading 切换模式时,如何在 iOS 6 中始终保持 MKMapView 朝北
【发布时间】:2013-04-13 05:13:23
【问题描述】:

我正在使用MKUserTrackingModeNone、MKUserTrackingModeFollow、MKUserTrackingModeFollowWithHeading 在三种不同的map 方向模式之间切换,这很有效。

但是,当我从 MKUserTrackingModeFollowWithHeading 切换到 MKUserTrackingModeNone 时,地图的方向没有重置为朝北方向(地图上的北方位于屏幕顶部)时出现问题。

在iphone/ipad的内置地图应用上,流程是这样的:

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

当你再次切换时,它会变成MKUserTrackingModeFollowWithHeading,并且地图会根据你面对/指向iPhone的方向旋转。

当你再次切换方向时,它会回到MKUserTrackingModeNone,并且地图很好地旋转回到北方。

我希望我的应用在切换模式时在方向上的行为方式相同,但是当我按照上面的步骤 4 进行操作并从 MKUserTrackingModeFollowWithHeading 切换到 MKUserTrackingModeNone 时,方向保持不变进行方向切换,而不是旋转回北方向。

我正在使用工具栏中的标准MKUserTrackingBarButtonItem 控件进行方向切换。

谁能帮我解决这个问题?

【问题讨论】:

  • 对不起,我无法帮助您,只能说在我的应用程序中它可以满足您的需求,并且除了同一个标准按钮之外,我没有做任何事情:/
  • 这可能有帮助,也可能没有帮助,因为我的经验是使用 iOS 5 - 确保您让内置功能(地图和 MKUserTrackingBarButtonItem)负责定位模式。确保您没有任何代码尝试在地图上设置方向模式。
  • 我没有设置任何方向模式。你的意思是说,我们不需要在我们添加地图的控制器中设置supportedInterfaceOrientations?或者是否可以在 MKMapView 上设置任何其他方向模式?
  • 这实际上是 stackoverflow.com/questions/10963555/… 的完全复制品

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


【解决方案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
}

可能有更好的方法来做到这一点,但我还没有找到。

【讨论】:

    【解决方案2】:

    在 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 提供给您的当前航向的任何计算都可能略有偏差,导致您的地图在您使用时略微偏北重做。

    【讨论】:

    • 我已经在运行 iOS 6.1.3 的 iPhone 4S 和 iPad 3 上测试了我的应用程序,当我通过循环 MKUserTrackingBarButtonItem 的状态将跟踪模式切换回无时,它们都返回北方。不需要其他代码。
    • 嗯,我想知道这个问题是否在更高版本的iOS中得到解决?我在 iOS 6.1 上进行测试。
    • 这不太可能,因为当我的设备也安装在 iOS 5 上时它也能正常工作。找出答案的最佳方法是更新您的设备
    【解决方案3】:

    您应该将一个小型测试应用程序放在一起,其中只有一个地图视图和一个 MKUserTrackingBarButtonItem 并将两者链接在一起。如果它应该按照您的描述进行并且不需要一行代码。所有的连接都可以在 IB 中完成。一旦你看到工作正常,你就可以返回你的代码并重复这个过程。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-19
      • 1970-01-01
      • 2022-12-17
      • 1970-01-01
      • 2013-03-17
      • 2011-11-19
      相关资源
      最近更新 更多