2016-09-30 2 views
0

Ich verwende programmatische Einschränkungen automatisch und ich möchte die Breite meiner Schaltfläche basierend auf der Änderung des Titels zurücksetzen. Angenommen, ich habe keinen Bezug auf die alte Width Constraint, die auf ihm eingerichtet wurde, wie kann ich seine Breite wiederherstellen? Es scheint mir, dass das Erstellen einer neuen Breitenbeschränkung nicht funktioniert - ich muss die alte deaktivieren und dann eine neue aktivieren. Aber ich habe keinen Hinweis auf den alten.Reconstrain Breite eines UIButton

// adding a new constraint 
myButton.widthAnchor.constraintEqualToConstant(myNewWidth).active = true 
+0

Warum haben Sie keinen Hinweis auf die alte Breitenbeschränkung? Standardmäßig wird die Breite einer Schaltfläche ihren Inhalt umrahmen, sodass Sie vielleicht gar keine Breitenbeschränkung benötigen. Stellen Sie die horizontale Mitte und vielleicht eine maximale Breite – Paulw11

+0

Ich versuche, eine generische Methode zu schreiben, die einen Parameter, in diesem Fall eine UIButton, zurückdrängt. Wäre nett, nach allen Beschränkungen für einen Anker zu fragen. – andrewz

Antwort

1

Erstellen Sie eine NSLayoutConstraint-Eigenschaft in Ihrer Klasse. Wenn Sie die Breiteneinschränkung Ihrer Schaltfläche programmatisch festlegen, weisen Sie dieser Eigenschaft die neue Einschränkung zu.

Dann, wenn Sie die Einschränkung aktualisieren müssen Sie nur diese

myWidthConstraint.constant = newValue 
+1

Ich stimme zu, dass es hilfreich ist, einen Verweis auf die Einschränkung beizubehalten, aber es wäre zum Beispiel vorzuziehen, nach einer Einschränkung für einen Breitenanker zu suchen. – andrewz

1

Sie können versuchen diese. Ich habe es noch nicht versucht. Als erstes brauchst du einen Bündel von Filtern gefiltert oder alle, um durchzuschlüpfen und den benötigten zu finden. Dafür können Sie das verwenden.

var constraint: NSLayoutConstraint! = nil 
let constraints = myButton.constraintsAffectingLayoutForAxis(UILayoutConstraintAxis.Horizontal) 

oder dies wird alle Ihre Einschränkungen bekommen.

var constraint: NSLayoutConstraint! = nil 

Dann müssen Sie durchlaufen sie und finden Sie die erforderliche wie folgt.

for const in myButton.constraints { 
    if const.firstAttribute == NSLayoutAttribute.Width { 
     constraint = const 
     break 
    } 
} 

erste Attribut der Breite Einschränkung setzt immer als „Breite“ und auch können Sie für den Artikel wie unten zusätzliche Prüfung setzen, auf dem die Einschränkung mit dem if-Klausel

const.firstItem as! NSObject == myButton 

weil erste Element angewendet wird der Breitenbeschränkung ist es selbst. versuchen, wenn funktioniert. Und wenn Sie es finden, schlage ich vor, die spezifische Einschränkung zu entfernen und neue hinzuzufügen. Um die Einschränkung der Breite für ein Objekt hinzuzufügen, wird der Code verwendet. Angenommen, die gewünschte Breite beträgt 50 px.

myButton.addConstraint(NSLayoutConstraint(item: myButton, attribute: NSLayoutAttribute.Width, relatedBy: NSLayoutRelation.Equal, toItem: nil, attribute: NSLayoutAttribute.NotAnAttribute, multiplier: 1.0, constant: 50.0)) 

Dies ist der richtige Ansatz. Aktivieren oder deaktivieren Sie es nicht.