我是在添加另一个或更改此约束吗?

时间:2017-01-18 21:32:34

标签: ios swift3 nslayoutconstraint

说我这样做......

override func viewDidLoad() {
   super.viewDidLoad()
   view.heightAnchor.constraint(equalToConstant: 50).isActive = true

之后,我这样做......

view.heightAnchor.constraint(equalToConstant: 51).isActive = true
我是个坏人吗?

我现在是否冗余地添加了第二个约束(第一个会发生什么?)

或者它知道改变第一个吗?

还是会发生其他事情?我在泄漏吗?

如果有的话,我应该做什么,以及我以何种方式做坏事?

这里做的正确是什么?

1 个答案:

答案 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,那么这是不可取的,因为它是可变的。)