Ios 自动布局我可以将CenterY与顶部和底部约束结合起来吗?
我想让这个布局有点动感。这里的选项是动态的(未知计数),因此我们可以轻松地将这些选项放在tableView、collectionView或只是简单的scrollView中 问题是,如果可能的话,我想让这个白色容器变小,并且垂直居中。当我将centerY约束与顶部+底部插入组合时,似乎只有顶部和底部约束被激活 当选项相当长时,选项可以滚动,但保持有顶部和底部插入的事实 我已经有了一些想法,比如观察容器视图的高度是否超过设备高度 我使用snapKit,但约束应该是可以理解的。以下是我当前的布局:Ios 自动布局我可以将CenterY与顶部和底部约束结合起来吗?,ios,constraints,nslayoutconstraint,snapkit,Ios,Constraints,Nslayoutconstraint,Snapkit,我想让这个布局有点动感。这里的选项是动态的(未知计数),因此我们可以轻松地将这些选项放在tableView、collectionView或只是简单的scrollView中 问题是,如果可能的话,我想让这个白色容器变小,并且垂直居中。当我将centerY约束与顶部+底部插入组合时,似乎只有顶部和底部约束被激活 当选项相当长时,选项可以滚动,但保持有顶部和底部插入的事实 我已经有了一些想法,比如观察容器视图的高度是否超过设备高度 我使用snapKit,但约束应该是可以理解的。以下是我当前的布局: f
func setupUI() {
self.view.backgroundColor = .clear
self.view.addSubviews(
self.view_BGFilter,
self.view_Container
)
self.view_BGFilter.snp.makeConstraints {
$0.edges.equalToSuperview()
}
self.view_Container.snp.makeConstraints {
$0.centerY.equalToSuperview().priority(.high)
//$0.top.bottom.greaterThanOrEqualToSuperview().inset(80.0).priority(.medium)
$0.leading.trailing.equalToSuperview().inset(16.0)
}
// Setup container
self.view_Container.addSubviews(
self.label_Title,
self.stackView,
self.button_Submit
)
self.label_Title.snp.makeConstraints {
$0.top.equalToSuperview().inset(40.0)
$0.leading.trailing.equalToSuperview().inset(16.0)
}
self.stackView.snp.makeConstraints {
$0.top.equalTo(self.label_Title.snp.bottom).offset(29.0)
$0.leading.trailing.equalToSuperview().inset(24.0)
}
self.button_Submit.snp.makeConstraints {
$0.height.equalTo(52.0)
$0.top.equalTo(self.stackView.snp.bottom).offset(30.0)
$0.bottom.leading.trailing.equalToSuperview().inset(24.0)
}
self.generateButtons()
}
我回答你的问题-以顶部和底部约束为中心?-附带了一些评论 我知道SnapKit很受欢迎,我相信它有时会非常有用,特别是如果你一直使用它的话 然而。。。当你使用它时,你永远不能绝对肯定它在做什么。而且,根据我的经验,使用SnapKit的人通常并不真正理解什么是约束条件或约束条件是如何工作的(这并不意味着你就属于这种情况,…只是从各种问题中观察到的结果) 在这种特定情况下,SnapKit有一点缺陷,或者这一行不太适合期望的结果:
$0.top.bottom.greaterThanOrEqualToSuperview().inset(80.0)
您可以通过简单的测试进行确认:
class TestViewController: UIViewController {
let testView: UIView = {
let v = UIView()
v.backgroundColor = .red
return v
}()
override func viewDidLoad() {
super.viewDidLoad()
view.addSubview(testView)
testView.snp.makeConstraints {
$0.centerY.equalToSuperview()
// height exactly 200 points
$0.height.equalTo(200.0)
// top and bottom at least 80 points from superview
$0.top.bottom.greaterThanOrEqualToSuperview().inset(80.0)
$0.leading.trailing.equalToSuperview().inset(16.0)
}
}
}
这就是结果。。。无法同时满足约束。调试控制台中的消息:
如果我们按如下方式替换该行:
// replace this line
//$0.top.bottom.greaterThanOrEqualToSuperview().inset(80.0)
// with these two lines
$0.top.greaterThanOrEqualToSuperview().offset(80.0)
$0.bottom.lessThanOrEqualToSuperview().offset(-80.0)
这显然是在做同样的事情,我们得到了我们所期望的:
所以,SnapKit中的某些东西是可疑的
这会解决你的问题。更改视图\u容器约束设置,如下所示:
self.view_Container.snp.makeConstraints {
$0.centerY.equalToSuperview().priority(.required)
// replace this line
//$0.top.bottom.greaterThanOrEqualToSuperview().inset(80.0)
// with these two lines
$0.top.greaterThanOrEqualToSuperview().offset(80.0)
$0.bottom.lessThanOrEqualToSuperview().offset(-80.0)
$0.leading.trailing.equalToSuperview().inset(16.0)
}
更改前:
更改后:
关于在您有许多选项按钮时添加滚动,我可以给您一个示例,用于滚动所有内容或仅滚动选项按钮。是否希望选项按钮**滚动(需要时),保留标题和OK按钮?或者你想让标题、选项按钮和Okaaay按钮全部滚动?很好的发现!谢谢!