我是否要添加另一个或更改此约束?
Am I adding yet another, or changing, this constraint?
说我这样做...
override func viewDidLoad() {
super.viewDidLoad()
view.heightAnchor.constraint(equalToConstant: 50).isActive = true
稍后,我这样做...
view.heightAnchor.constraint(equalToConstant: 51).isActive = true
我是坏人吗?
我现在是否多余地添加了第二个约束(第一个发生了什么?)
或者它知道改变第一个吗?
还是发生了其他事情?我在泄漏吗?
我应该怎么办,我在哪些方面做得不好,如果有的话?
这里正确的做法是什么?
view.heightAnchor.constraint(equalToConstant: 50).isActive = true
later, I do this ...
view.heightAnchor.constraint(equalToConstant: 51).isActive = true
am I a bad person?
是的,如果我没记错的话,运行时会在控制台中用响亮的消息告诉您,警告您有无法满足的(冲突的)约束。您有一个约束将高度设置为 50,另一个约束将高度设置为 51,但两者都不可能成立。
你没有提供足够的代码来确定你的情况发生了什么,但是你可以很容易地看到我说的是正确的,通过让你的视图控制器的代码只包含以下内容:
func delay(_ delay:Double, closure:@escaping ()->()) {
let when = DispatchTime.now() + delay
DispatchQueue.main.asyncAfter(deadline: when, execute: closure)
}
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let v = UIView()
v.translatesAutoresizingMaskIntoConstraints = false
self.view.addSubview(v)
v.topAnchor.constraint(equalTo: self.view.topAnchor).isActive = true
v.leadingAnchor.constraint(equalTo: self.view.leadingAnchor).isActive = true
v.widthAnchor.constraint(equalToConstant: 100).isActive = true
v.heightAnchor.constraint(equalToConstant: 50).isActive = true
delay(3) {
v.heightAnchor.constraint(equalToConstant: 51).isActive = true
}
}
}
按照您的规定,我们 "later" 添加了 51 约束 — 正如我所说,运行时在那一刻发出尖叫声。
正确的步骤是保持对原始约束的引用
以便您稍后可以更改其 constant
。 (在更复杂的情况下,您实际上可以在添加第二个约束之前停用(即删除)第一个约束,但是如果您打算做的只是更改 constant
,那是没有必要的,因为它是可变的。)
说我这样做...
override func viewDidLoad() {
super.viewDidLoad()
view.heightAnchor.constraint(equalToConstant: 50).isActive = true
稍后,我这样做...
view.heightAnchor.constraint(equalToConstant: 51).isActive = true
我是坏人吗?
我现在是否多余地添加了第二个约束(第一个发生了什么?)
或者它知道改变第一个吗?
还是发生了其他事情?我在泄漏吗?
我应该怎么办,我在哪些方面做得不好,如果有的话?
这里正确的做法是什么?
view.heightAnchor.constraint(equalToConstant: 50).isActive = true
later, I do this ...
view.heightAnchor.constraint(equalToConstant: 51).isActive = true
am I a bad person?
是的,如果我没记错的话,运行时会在控制台中用响亮的消息告诉您,警告您有无法满足的(冲突的)约束。您有一个约束将高度设置为 50,另一个约束将高度设置为 51,但两者都不可能成立。
你没有提供足够的代码来确定你的情况发生了什么,但是你可以很容易地看到我说的是正确的,通过让你的视图控制器的代码只包含以下内容:
func delay(_ delay:Double, closure:@escaping ()->()) {
let when = DispatchTime.now() + delay
DispatchQueue.main.asyncAfter(deadline: when, execute: closure)
}
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let v = UIView()
v.translatesAutoresizingMaskIntoConstraints = false
self.view.addSubview(v)
v.topAnchor.constraint(equalTo: self.view.topAnchor).isActive = true
v.leadingAnchor.constraint(equalTo: self.view.leadingAnchor).isActive = true
v.widthAnchor.constraint(equalToConstant: 100).isActive = true
v.heightAnchor.constraint(equalToConstant: 50).isActive = true
delay(3) {
v.heightAnchor.constraint(equalToConstant: 51).isActive = true
}
}
}
按照您的规定,我们 "later" 添加了 51 约束 — 正如我所说,运行时在那一刻发出尖叫声。
正确的步骤是保持对原始约束的引用
以便您稍后可以更改其 constant
。 (在更复杂的情况下,您实际上可以在添加第二个约束之前停用(即删除)第一个约束,但是如果您打算做的只是更改 constant
,那是没有必要的,因为它是可变的。)