自动布局中的相对中心
Posted
技术标签:
【中文标题】自动布局中的相对中心【英文标题】:Relative Center in Autolayout 【发布时间】:2018-09-02 11:53:32 【问题描述】:我正在使用自动布局来定位我的视图。
在我的例子中,上面是一个UILabel
,下面是一个UIStackView
。
UIStackView
是为.fill
配置的,所有arrangedSubviews
都有一个正确的heightConstraint
。
我想要做的是添加约束,以便UIStackView
在myLabel.bottomAnchor
和mySuperview.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
的上方和下方添加了空的UIView
s,并将外部的设置为Fit Proportionally
或者……
【讨论】:
感谢您提供这个全面的示例!但是,我正在寻找一种不使用其他视图的解决方案。以上是关于自动布局中的相对中心的主要内容,如果未能解决你的问题,请参考以下文章
如何使用ios中的自动布局将三个按钮并排放置在中心并留有间距?