2017-04-18 2 views
0

Wenn ich versuche, die SnapKit-Einschränkung direkt nach der Einschränkung zu aktualisieren, erhalte ich einen Fehler Updated constraint could not find existing matching constraint to update. Der Code, den ich verwende, ist unten:Update-Einschränkung funktioniert nicht auf 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) 
} 

Antwort

2

Die documentation sagt, dass updateConstraints ist nur für die Konstanten der bestehenden Einschränkungen zu aktualisieren.

Alternative, wenn Sie nur den konstanten Wert der Constraint Aktualisierung Sie die Methode snp.updateConstraints statt snp.makeConstraints können

Sie sind nicht die ständige Aktualisierung; Sie versuchen, die Einschränkung einem neuen Anker zuzuordnen.

Ich denke, was Sie tun sollten, einen Verweis auf die obere Beschränkung ist nehmen:

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

später die obere Einschränkung entfernen:

topConstraint.uninstall() 

Dann einen weiteren Block verwenden, um die neue Einschränkung zu machen.

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

Was meinst du nur die Konstante? Ich verwende die updateConstraints in einem 'UIView.animate', also muss ich es als updateConstraints behalten. – SmedleyDSlap

+0

die konstante Eigenschaft von NSLayoutConstraint. Ich sehe nicht, warum Sie makeConstraints nicht für UIView.animate verwenden können; obwohl mir unklar ist, ob der Aufruf von makeConstraints layoutIfNeeded aufruft. Wenn nicht, rufe make constrains zuerst auf und lege einfach self.view.layoutIfNeeded in den Animationsblock, um die automatische Neuberechnung und den Framewechsel auszulösen. –

Verwandte Themen