说我这样做......
override func viewDidLoad() {
super.viewDidLoad()
view.heightAnchor.constraint(equalToConstant: 50).isActive = true
之后,我这样做......
view.heightAnchor.constraint(equalToConstant: 51).isActive = true
我是个坏人吗?
我现在是否冗余地添加了第二个约束(第一个会发生什么?)
或者它知道改变第一个吗?
还是会发生其他事情?我在泄漏吗?
如果有的话,我应该做什么,以及我以何种方式做坏事?
这里做的正确是什么?
答案 0 :(得分:3)
view.heightAnchor.constraint(equalToConstant: 50).isActive = true
之后,我这样做......
我是个坏人吗?view.heightAnchor.constraint(equalToConstant: 51).isActive = true
是的,如果我没有弄错的话,运行时会在控制台中发出响亮的消息告诉你警告你有不可满足(冲突)的约束。你有一个约束将高度设置为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
}
}
}
按照你的规定,我们“稍后”添加51约束 - 正如我所说,运行时在那一刻发出嘎嘎声。
正确的程序是保持对原始约束的引用
这样您以后可以更改constant
。 (在更复杂的情况下,您可以在添加第二个约束之前实际停用,即删除第一个约束,但如果您打算做的只是更改constant
,那么这是不可取的,因为它是可变的。)