Snapkit:将多个限制为边距

Posted

技术标签:

【中文标题】Snapkit:将多个限制为边距【英文标题】:Snapkit: Constrain multiple to margins 【发布时间】:2017-09-08 14:52:26 【问题描述】:

我正在使用 Snapkit 来简化我的自动布局代码,但是一个场景似乎经常弹出,我想知道是否有一种方法可以减少代码。

假设我需要将 UIView 的边缘固定到它的超级视图边距,我们可能会这样做:

subView.snp.makeConstraints  make in
    make.top.equalTo(parentView.snp.topMargin)
    make.bottom.equalTo(parentView.snp.bottomMargin)
    make.left.equalTo(parentView.snp.leftMargin)
    make.right.equalTo(parentView.snp.rightMargin)

这实质上会导致子视图填充父视图,除了父视图布局边距定义的少量填充。我相信这种变化很常见。

对于这个库来说,这似乎过于冗长。它有一些非常好的辅助方法,例如这些

make.edges.equalToSuperview()
make.top.left.right.equalToSuperview()

然而,我在他们的文档中没有找到关于边距的如何执行上述两个辅助方法。

我正在寻找的(如果存在的话)类似于:

make.edges.equalToSuperview().withMargins()
make.top.left.right.equalToSuperview().withMargins()
make.top.left.right.equalTo(someview).withMargins()

那么,除了非常冗长的方法之外,还有其他方法吗?我是否遗漏了文档中的某些内容,或者这可以通过扩展添加?

【问题讨论】:

【参考方案1】:

你尝试过这样的事情吗?

subView.snp.makeConstraints  make in
    make.edges.equalTo(view.snp.margins)

评论后编辑:

当您只想将某些边缘约束到超级视图边距时,您可以这样做。

subView.snp.makeConstraints  make in
    make.top.leading.equalTo(view).inset(view.layoutMargins)

subView.snp.makeConstraints  make in
    make.top.leading.equalTo(view.layoutMarginsGuide)

subView.snp.makeConstraints  make in
    make.top.leading.equalTo(view.safeAreaLayoutGuide)

【讨论】:

这解决了一半的问题,我可以开始清理我的代码了。但这只有在您完成所有边缘时才有效。 make.top.left.equalTo(view.snp.margins) 将不起作用,因为它们不匹配。也许我需要编写一个扩展来支持该功能,这似乎是一件很常见的事情,所以我希望库中已经有一个更优雅的解决方案。 @TRG 检查编辑在这种情况下您可以做什么。 使用...inset(view.layoutMargins 时要记住的重要一点是,它会根据 layoutMargins 的值创建一个常量。如果在约束创建后布局边距发生变化(可能在 tableview 中),它们将不会被更新。【参考方案2】:

一个很好的方法是使用UIView.layoutMarginsGuide

childView.snp.makeConstraints  make in
    make.top.leading.bottom.equalTo(parentView.layoutMarginsGuide)
    make.trailing.equalTo(otherView.snp.leading).offset(-8.0)

【讨论】:

你也可以使用.inset(8.0)来避免使用负数

以上是关于Snapkit:将多个限制为边距的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 flexbox 均匀地显示内容卡,包括边距边 [重复]

UILabel给文字增加内边距

中心页面内容边距:0 auto;不工作? [复制]

如何将边缘设置为零?

如何将 update_layout 边距限制为 Plotly / Dash 中的一个子图?

如何让 SnapKit 约束左右边缘?