17

我在我的应用程序中使用 MapView 来显示一些注释。在 iOS 7 中,指南针随机出现在地图上。我无法重现该错误,因为它随机出现,但我想禁用它。任何想法如何禁用它?

更新:我发现不是随机出现,而是在特定手势上出现。当您使用 2 根手指并向右滑动另一根手指时。

4

8 回答 8

30

showsCompass您可以使用该属性在 OSX 10.9 / iOS 9 及更高版本上轻松禁用指南针。

目标-C:

mapView.showsCompass = NO;

迅速:

mapView.showsCompass = false

以这种方式隐藏指南针不会阻止自定义 MKCompassButton 正常运行和显示。

在 iOS 8 或更早版本上,您的选择是:

  1. 把它吸起来,和它一起生活。

  2. 使用 hack,例如:

  3. 如果您没有以编程方式旋转地图并且尚未旋转,请完全禁用旋转,使用

     mapView.rotateEnabled = NO;
    

指南针仅在地图旋转时显示,因此通过这样做可以确保指南针永远不会被触发。

我不清楚为什么 Apple 等了这么久才允许在 iOS 上隐藏指南针,而且上述选项都不理想。选择你认为对你的情况最不利的那个。

于 2013-10-05T10:29:15.270 回答
7

我找到了解决您问题的方法,使用 Mark Amery 关于遍历MKMapView实例子视图以查找指南针的想法,以及使用手势识别来触发删除事件。

为了找到指南针,我打印了视图的描述,发现其中一个视图是 的实例MKCompassView,这显然是指南针。

我想出了以下代码,应该适合你。它检查旋转手势,然后在由手势事件触发的方法中删除视图。

我已经测试了这种方法,它对我很有效:

- (void)viewDidLoad
{
    [super viewDidLoad];

    UIRotationGestureRecognizer *rotateGesture = [[UIRotationGestureRecognizer alloc] initWithTarget:self action:@selector(rotate:)];

    [self.mapView addGestureRecognizer:rotateGesture];
}

-(void)rotate:(UIRotationGestureRecognizer *)gesture
{
    if ([gesture state] == UIGestureRecognizerStateBegan || [gesture state] == UIGestureRecognizerStateChanged) {
        // Gets array of subviews from the map view (MKMapView)
        NSArray *mapSubViews = self.mapView.subviews;

        for (UIView *view in mapSubViews) {
            // Checks if the view is of class MKCompassView
            if ([view isKindOfClass:NSClassFromString(@"MKCompassView")]) {
                // Removes view from mapView
                [view removeFromSuperview];
            }
        }
    }
}
于 2014-02-28T17:11:43.007 回答
4

UIView使用您想要的地图框架创建一个包装器并clipsToBounds设置为YES(或等效地,在界面生成器中设置剪辑子视图)。然后把你MKMapView放在那个包装视图里面,地图框架的y坐标设置为,例如,-80地图的高度,使其垂直中心与其父级对齐。

然后将显示指南针,但您看不到它,因为它位于其父视图的顶部 - 问题已解决。

于 2013-10-11T13:10:10.357 回答
1

这是 Swift 4 的解决方案:

mapView.compassView.isHidden = true
于 2017-11-13T16:41:21.133 回答
0

您可以在旋转地图时隐藏 MKMapView 上的指南针,方法是在所有 iOS 的 viewDidLoad 方法中添加以下行:

[self.mapView setLayoutMargins:UIEdgeInsetsMake(-50, 0, -50, 0)];
于 2015-12-02T10:08:24.583 回答
0

这里快速代码:

let mapRotateGesture = UIRotationGestureRecognizer(target: self, action: "didRotateMap:")
mapRotateGesture.delegate = self
self.map.addGestureRecognizer(mapRotateGesture)

func didRotateMap(gesture: UIGestureRecognizer) {
    // Removeing compass
    if (gesture.state == .Began || gesture.state == .Changed) {
        for view in map.subviews as! [UIView] {
            if view.isKindOfClass(NSClassFromString("MKCompassView")) {
                view.removeFromSuperview()
            }
        }
    }
}
于 2015-08-27T12:25:50.843 回答
0

完全隐藏指南针,不旋转地图

mapView.allowsRotating = false

Swift 4,Mapbox-iOS-SDK (4.9.0)

于 2019-03-07T12:53:30.290 回答
-2

据我了解,您想要的是禁止显示用户的当前位置。您应该使用 @property(nonatomic) BOOL 显示用户位置。 这方面的文档

假设@property(nonatomic) MKUserTrackingMode userTrackingMode 不能启用或禁用跟踪,它只是在不跟随、跟随和跟随旋转之间改变模式。

于 2013-10-05T09:30:13.783 回答