罗盘在地图视图中的放置或位置iOS6

罗盘在地图视图中的放置或位置iOS6,ios,swift,cocoa-touch,mkmapview,Ios,Swift,Cocoa Touch,Mkmapview,有人知道如何更改指南针在MKMapview中的位置吗 我说的是指南针,当它旋转时会出现在地图的右上角 我这样做是为了让你能在导航栏下面看到模糊的地图,这意味着帧的y原点将在导航栏下面。问题是,当地图旋转时,它会自动在右上角添加指南针按钮,正如您在下面的屏幕截图中所看到的,导航栏会覆盖该按钮 我没有看到任何关于指南针的文档,有人有什么想法吗?我的测试表明,MKMapView不知怎么知道它是在什么上下文中显示的。如果使用常规UINavigationController,即使指南针是半透明的,也会将

有人知道如何更改指南针在MKMapview中的位置吗

我说的是指南针,当它旋转时会出现在地图的右上角

我这样做是为了让你能在导航栏下面看到模糊的地图,这意味着帧的y原点将在导航栏下面。问题是,当地图旋转时,它会自动在右上角添加指南针按钮,正如您在下面的屏幕截图中所看到的,导航栏会覆盖该按钮


我没有看到任何关于指南针的文档,有人有什么想法吗?

我的测试表明,
MKMapView
不知怎么知道它是在什么上下文中显示的。如果使用常规
UINavigationController
,即使指南针是半透明的,也会将其定位在导航栏下方

iOS 7中有一个新的
UIViewController
属性,定义Y轴上实际内容的开始。它被称为
topLayoutGuide

遗憾的是,您无法真正影响Apple在不同内容中计算此属性的值。它还取决于状态栏的可见性

但是:为了解决这个问题,我创建了一个简单的自定义对象,并在自定义视图控制器中返回:

@interface MiFixedLayoutGuide : NSObject <UILayoutSupport>
@property (nonatomic) CGFloat pbLength;
- (id)initWithLength:(CGFloat)length;
@end

@implementation MiFixedLayoutGuide

- (id)initWithLength:(CGFloat)length {
    self = [super init];
    if (self) {
        _pbLength = length;
    }
    return self;
}

- (CGFloat)length {
    return _pbLength;
}

@end
这将按44点插入布局参考线。而
MKMapView
将使用这些值将指南针定位在顶部,将“合法”标签定位在底部


您现在必须注意的一件事是,您不能再在自动布局视觉格式语言中使用布局指南

使用iOS 8,您可以简单地执行以下操作:

[someMapView setLayoutMargins:UIEdgeInsetsMake(20, 0, 20, 0)];

Swift:

mapView.layoutMargins = UIEdgeInsets(top: 20, left: 0, bottom: 20, right: 0)

其中,您可以计算UI元素的高度,而不是20,以获得一个更动态的解决方案来调整每个设备或元素。

一个小的补充:MKMapView还使用布局指南来定义地图的中心。如果我的地图视图直接在view controller的视图中,但是如果它是层次结构中更深一层的话,它似乎忽略了这些值。如果我的视图有一个包含地图的滚动视图,那么我必须将此代码放在哪里?@gklka尚未测试您的要求。但我的经验是,
UIScrollView
s在布局指南和地图视图方面是“邪恶的”。当您找到解决方案时,请告诉我,我会更新我的答案。您的解决方案对我来说非常有效,但添加正确的边距似乎不起作用。有什么想法吗?我试过:-(id)rightLayoutGuide{…}@Klaas为什么要创建MiFixedLayoutGuide类?为什么不让包含mapView的视图控制器符合。然后在其中实现length(),返回值为44。对于topLayoutGuide()和bottomLayoutGuide,返回self(包含贴图的视图控制器)。我认为没有必要使用MiFixedLayoutGuide类。但在实现此解决方案后,地图上的“合法”标签是否存在问题。若我们将地图上的“合法”标签改为“指南针”,它也会被移动。在我的例子中,当我试图改变指南针的位置时,“合法”标签也会被移动并显示在地图的中心位置。如果指南针与地图上添加的任何其他组件重叠,是否有办法将指南针置于顶部(置于前面)。例如,地图上的按钮在swift 4中工作完美
mapView.layoutMargins = UIEdgeInsets(top: 20, left: 0, bottom: 20, right: 0)