2017-04-18 63 views
0

當我嘗試在創建約束後立即更新snapkit約束時,出現Updated constraint could not find existing matching constraint to update錯誤。我使用的代碼如下:更新約束在UITableView snapkit上不起作用

let directionList = UITableView() 
directionList.delegate = self 
directionList.dataSource = self 
directionList.tag = DIRECTIONS_TABLE_TAG 
self.view.addSubview(directionList) 
directionList.snp.makeConstraints{ (make) -> Void in 
    make.width.equalToSuperview() 
    make.top.equalTo(self.view.snp.bottom) 
    make.left.equalToSuperview() 
    make.right.equalToSuperview() 
    make.bottom.equalToSuperview().offset(-20) 
} 

directionList.snp.updateConstraints { (make) -> Void in 
    make.top.equalTo(self.topDarkBlue.snp.bottom) 
} 

回答

2

documentation說updateConstraints僅用於更新現有的約束常數。

的選擇,如果你只更新 約束的恆定值,你可以用它代替 snp.makeConstraints

你沒有更新的恆方法snp.updateConstraints;您正試圖將約束分配給新的錨。

,我認爲你應該做的是採取參考頂部約束:

var topConstraint: Constraint? = nil 
... 
topConstraint = make.top.equalTo(self.view.snp.bottom) 

以後刪除頂部約束:

topConstraint.uninstall() 

然後用另一個塊,使新的約束。

directionList.snp.makeConstraints{ (make) -> Void in 
    make.top.equalTo(self.topDarkBlue.snp.bottom) 
} 
+0

你是什麼意思只是常數?我在'UIView.animate'中使用updateConstraints,所以我需要將它保留爲updateConstraints。 – SmedleyDSlap

+0

NSLayoutConstraint的.constant屬性。我不明白你爲什麼不能爲UIView.animate使用makeConstraints;雖然我不清楚如果調用makeConstraints調用layoutIfNeeded。如果不是,則先調用約束條件,然後將self.view.layoutIfNeeded放入動畫塊中以觸發自動佈局重新計算和框架更改。 –