使用自动布局设置 layoutMargins

Posted

技术标签:

【中文标题】使用自动布局设置 layoutMargins【英文标题】:Set layoutMargins using auto layout 【发布时间】:2016-04-13 23:56:43 【问题描述】:

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

为此,我可以在代码中设置 layoutMargins 属性,如下所示:

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

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

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

【问题讨论】:

【参考方案1】:

在界面生成器中,只需使用 0 的边距将地图视图的边缘固定到超级视图的边缘。然后您可以使用边距为 0。然后为 Visual Effects 视图创建一个顶部约束(使用那里的任何数字。你要更改它。)

然后在 VFX 视图顶部约束的检查器中,您可以将“第二项”更改为“中心 Y”。这意味着您的顶部边缘现在固定在超级视图垂直中心的中心。

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

【讨论】:

感谢您的回复,但这并不能解决我的问题。将效果视图固定到屏幕的下半部分没有问题。我正在尝试将地图的底部布局边距固定到视觉效果视图的顶部边缘或其高度。 抱歉,问题略过太快了。您可以在大小检查器下的 IB 中显式设置布局边距,尽管您似乎正在寻找更动态的东西。我会考虑在这种情况下使用尺寸等级。根据需要在任意多的旋转中显式设置高度,并让尺寸类处理旋转和调整大小。 我尝试了该设置,但它没有任何效果,是的,我需要将边距作为约束而不是显式值。【参考方案2】:

回答我自己的问题!似乎不可能在 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 调用一个方法似乎很糟糕,该方法接受一个非 null 参数,该参数也调用 super 但 Apple do it in this sample。

在一种情况下,这并不总是有效。如果您从横向切换到纵向并再次切换得太快,则边距不会更新。但是 UIKit 充满了这样的错误,所以只能放手。

【讨论】:

以上是关于使用自动布局设置 layoutMargins的主要内容,如果未能解决你的问题,请参考以下文章

使用自动布局约束在 UIScrollView 内为 UIView 设置动画

缩进 UITableViewCell 中的所有自动布局约束

如何通过自动布局进行四分之一

iOS自动布局重置我所有的图像位置

使用自动布局的屏幕外 UIView(以编程方式)

在不使用自动布局的情况下调整 iPhone 5 屏幕尺寸