需要有关自动布局锚点的帮助
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了需要有关自动布局锚点的帮助相关的知识,希望对你有一定的参考价值。
我正在学习自动布局锚点并试图以编程方式实现这个简单的事情
在这里我的代码
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(true)
let view1 = UIView()
view1.backgroundColor = .brown
blueView.addSubview(view1)
view1.translatesAutoresizingMaskIntoConstraints = false
view1.topAnchor.constraint(equalTo: blueView.topAnchor, constant:10).isActive = true
view1.bottomAnchor.constraint(equalTo: blueView.bottomAnchor, constant:10).isActive = true
view1.leadingAnchor.constraint(equalTo: blueView.leadingAnchor, constant:10).isActive = true
view1.trailingAnchor.constraint(equalTo: blueView.trailingAnchor, constant:10).isActive = true
view1.heightAnchor.constraint(equalToConstant: 80).isActive = true
view1.widthAnchor.constraint(equalToConstant: 80).isActive = true
}
这就是我得到的
出了什么问题?
答案
出了什么问题?
我看到三类问题:
- 一些约束不活跃。没有设置
heightAnchor
和widthAnchor
约束,以便isActive = true
- 约束是冲突的。您正在基于常量设置约束,而不考虑超视图的尺寸。这导致了冲突的限制,例如,
view1
不能高出100点,超级视图顶部263点,底部锚点284点,同时也是如此。 - 基于常量的约束通常无法将视图置于屏幕中心,因为屏幕尺寸变化很大。
以下是这三个问题的一种可能解决方案:
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(true)
let view1 = UIView()
view1.backgroundColor = .brown
view.addSubview(view1)
view1.translatesAutoresizingMaskIntoConstraints = false
view1.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
view1.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true
view1.heightAnchor.constraint(equalToConstant: 100.0).isActive = true
view1.widthAnchor.constraint(equalToConstant: 100.0).isActive = true
}
在这里,我们将view1
的X和Y中心设置为等于超视图的X和Y中心,将view1
的高度和宽度定义为常量,并将所有相关约束设置为活动的。
您可以在Auto Layout Guide找到其他解决方案。
另一答案
尝试这样做:
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(true)
let view1 = UIView()
view1.backgroundColor = .brown
view.addSubview(view1)
view1.translatesAutoresizingMaskIntoConstraints = false
//Constraints
let centerXConstraint = view1.centerXAnchor.constraint(equalTo: self.view.centerXAnchor, constant: 0)
let centerYConstraint = view1.centerYAnchor.constraint(equalTo: self.view.centerYAnchor, constant: 0)
let widthConstraint = view1.widthAnchor.constraint(equalToConstant: 100)
let heightConstraint = view1.heightAnchor.constraint(equalToConstant: 100)
//Apply constraints
constraintToApply.append(centerXConstraint)
constraintToApply.append(centerYConstraint)
constraintToApply.append(widthConstraint)
constraintToApply.append(heightConstraint)
}
并添加以下代码:
override func viewDidAppear(_ animated: Bool) {
// Apply Constraints
NSLayoutConstraint.activate(constraintToApply)
self.view.layoutIfNeeded()
}
希望这可以帮到你。
另一答案
您为每个约束添加+10个点。
view1.topAnchor.constraint(equalTo: blueView.topAnchor, constant:10).isActive = true
这意味着“将view1的顶部锚点设置为blueView加10的顶部锚点”
只需删除constant:10
view1.topAnchor.constraint(equalTo: blueView.topAnchor).isActive = true
如果您设置顶部,底部,左侧,前导和尾随锚点,则不应设置高度和宽度。宽度和高度将根据这4个锚点计算。所以,你应该删除
view1.heightAnchor.constraint(equalToConstant: 80).isActive = true
view1.widthAnchor.constraint(equalToConstant: 80).isActive = true
以上是关于需要有关自动布局锚点的帮助的主要内容,如果未能解决你的问题,请参考以下文章