我在我的应用程序中使用 MapView 来显示一些注释。在 iOS 7 中,指南针随机出现在地图上。我无法重现该错误,因为它随机出现,但我想禁用它。任何想法如何禁用它?
更新:我发现不是随机出现,而是在特定手势上出现。当您使用 2 根手指并向右滑动另一根手指时。
我在我的应用程序中使用 MapView 来显示一些注释。在 iOS 7 中,指南针随机出现在地图上。我无法重现该错误,因为它随机出现,但我想禁用它。任何想法如何禁用它?
更新:我发现不是随机出现,而是在特定手势上出现。当您使用 2 根手指并向右滑动另一根手指时。
showsCompass
您可以使用该属性在 OSX 10.9 / iOS 9 及更高版本上轻松禁用指南针。
目标-C:
mapView.showsCompass = NO;
迅速:
mapView.showsCompass = false
以这种方式隐藏指南针不会阻止自定义 MKCompassButton 正常运行和显示。
在 iOS 8 或更早版本上,您的选择是:
把它吸起来,和它一起生活。
使用 hack,例如:
定位地图以在屏幕外隐藏指南针(感谢 Alex Wien),或
遍历地图的视图层次结构以找到代表指南针的视图并将其移除(归功于 David Topolansky)。
如果您没有以编程方式旋转地图并且尚未旋转,请完全禁用旋转,使用
mapView.rotateEnabled = NO;
指南针仅在地图旋转时显示,因此通过这样做可以确保指南针永远不会被触发。
我不清楚为什么 Apple 等了这么久才允许在 iOS 上隐藏指南针,而且上述选项都不理想。选择你认为对你的情况最不利的那个。
我找到了解决您问题的方法,使用 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];
}
}
}
}
UIView
使用您想要的地图框架创建一个包装器并clipsToBounds
设置为YES
(或等效地,在界面生成器中设置剪辑子视图)。然后把你MKMapView
放在那个包装视图里面,地图框架的y坐标设置为,例如,-80
地图的高度,使其垂直中心与其父级对齐。
然后将显示指南针,但您看不到它,因为它位于其父视图的顶部 - 问题已解决。
这是 Swift 4 的解决方案:
mapView.compassView.isHidden = true
您可以在旋转地图时隐藏 MKMapView 上的指南针,方法是在所有 iOS 的 viewDidLoad 方法中添加以下行:
[self.mapView setLayoutMargins:UIEdgeInsetsMake(-50, 0, -50, 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()
}
}
}
}
完全隐藏指南针,不旋转地图
mapView.allowsRotating = false
Swift 4,Mapbox-iOS-SDK (4.9.0)
据我了解,您想要的是禁止显示用户的当前位置。您应该使用 @property(nonatomic) BOOL 显示用户位置。 这方面的文档
假设@property(nonatomic) MKUserTrackingMode userTrackingMode 不能启用或禁用跟踪,它只是在不跟随、跟随和跟随旋转之间改变模式。