自动布局中的相对中心

Posted

技术标签:

【中文标题】自动布局中的相对中心【英文标题】:Relative Center in Autolayout 【发布时间】:2018-09-02 11:53:32 【问题描述】:

我正在使用自动布局来定位我的视图。 在我的例子中,上面是一个UILabel,下面是一个UIStackViewUIStackView 是为.fill 配置的,所有arrangedSubviews 都有一个正确的heightConstraint。 我想要做的是添加约束,以便UIStackViewmyLabel.bottomAnchormySuperview.bottomAnchor 之间的空间中垂直居中。

到目前为止我尝试的是:

UIStackView 添加顶部和底部约束: _stackView.topAnchor.constraint(greaterThanOrEqualTo: _myLabel.bottomAnchor) _stackView.bottomAnchor.constraint(greaterThanOrEqualTo: _mySuperview.bottomAnchor)

现在它的工作原理是它只是将正确大小的UIStackView 放在_mySuperview 的底部。

然而,我想要的是它位于中心。 我看到有一个名为anchorWithOffset(to:) 的方法,听起来正是我需要的,但找不到正确的使用方法。

所以我的问题是,如何在两个给定的NSLayoutAnchors 之间将UIView 居中?

编辑:我知道我可以添加一个UIView,它是我的其他两个视图之间的约束,并将我的UIStackView 居中。不过,我正在寻找更纯粹的解决方案。

【问题讨论】:

我在回答时错过了您的“编辑”。不确定您所说的“更纯净”的解决方案是什么意思 “更纯粹”的意思是只使用适当的约束,而不使用额外的视图。虽然您的回答确实有效,但我正在寻找更多在这种情况下正确使用 AutoLayout。 【参考方案1】:

下一个代码可以解决问题:

let dimensionBefore = _myLabel.bottomAnchor.anchorWithOffset(to: _stackView.centerYAnchor)
let dimensionAfter = _stackView.centerYAnchor.anchorWithOffset(to: _mySuperview.bottomAnchor)
dimensionBefore.constraint(equalTo: dimensionAfter, multiplier: 1).isActive = true

但这仅适用于 ios 10 之后

【讨论】:

谢谢!正是我想要的。【参考方案2】:

看起来您想在代码中而不是在故事板/xib 中实现这一点,但这些通常对于测试自动布局想法非常有用 - 一旦您在故事板中使用它,就会清楚什么代码你需要写来做同样的事情。

您可以通过使用额外的垂直UIStackView 来包装您想要的UIStackView 来实现此目的。

在下面的示例中,我在内部UIStackView 的上方和下方添加了空的UIViews,并将外部的设置为Fit Proportionally

或者……

【讨论】:

感谢您提供这个全面的示例!但是,我正在寻找一种不使用其他视图的解决方案。

以上是关于自动布局中的相对中心的主要内容,如果未能解决你的问题,请参考以下文章

Interface Builder 中的相对自动布局约束

使用自动布局正确对齐通知中心小部件中的元素

如何使用ios中的自动布局将三个按钮并排放置在中心并留有间距?

自动布局 - 中心有 5 个按钮

iOS自动布局:将UILabel的左边缘与容器中的水平中心对齐?

ios - 如何使用ios swift中的自动布局以编程方式将两个标签并排放置在中心位置?