使用自动布局设置layoutMargins

时间:2016-04-13 23:56:43

标签: ios autolayout mapkit

我想要一个填充屏幕的地图视图,但其可用区域限制在上半部分(通过底部边缘布局边距),因此地图底部延伸到视觉效果视图(将包含一个表格)下方)在半屏高度固定在屏幕底部。它通常在工具栏的上方和下方延伸。

为了实现这一点,我可以在代码中设置layoutMargins属性,如下所示:

self.mapView.layoutMargins = UIEdgeInsetsMake(0, 0, self.view.frame.size.height / 2, 0);

但是我想用自动布局约束来做这件事,以便由于视图大小的改变而自动更新边距,例如由于屏幕旋转。有谁知道这是否可能?如果是这样,如何在IB或代码中添加特定的布局约束?我相信它可能需要使用NSLayoutAttributeBottomMargin。感谢。

Screenshot

在上面的屏幕截图中,您可以看到区域已设置为英国并填充地图视图的可用部分,您还可以看到左下角的Legal标签位于正确的位置。这些是在地图视图上使用layoutMargins属性的一些好处。

Storyboard constraints

2 个答案:

答案 0 :(得分:0)

在“界面”构建器中,只需使用边距0将地图视图的边缘固定到超级视图的边缘。然后,您可以使用以下方法将视觉效果视图的两侧和底部固定到超级视图的侧面和底部。边距为0.然后为视觉效果视图创建一个顶部约束(使用任何数字。你将改变它。)

然后在VFX视图顶部约束的检查器中,您可以更改" Second Item"到"中心Y"。这意味着您的上边缘现在固定在超视图垂直中心的中心。

这应该使Visual Effects视图始终固定在屏幕的下半部分。

答案 1 :(得分:0)

回答我自己的问题!似乎不可能在IB中为layoutMargins设置约束,但是可以通过为layoutMargins添加一个条目来设置用户定义的运行时属性,并使用一种CGRect并将底部边距设置为宽度参数。但是,由于我们需要动态布局,因此解决方案是将以下内容放在代码中:

- (void)viewDidLoad {
    [super viewDidLoad];
    [self viewWillTransitionToSize:self.view.bounds.size withTransitionCoordinator:nil];
}

-(void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator{
    [super viewWillTransitionToSize:size withTransitionCoordinator:coordinator];
    self.mapView.layoutMargins = UIEdgeInsetsMake(0, 0, size.height/2.0, 0);
}

调用带有nil的方法似乎很糟糕,该方法采用非空的参数调用超级Apple do it in this sample

有一种情况,这种情况并不总是有效。如果您从横向切换到纵向再过快,那么边距不会更新。然而,UIKit充满了这样的错误,所以只需要放手。