Wie kann ich die konstante Höhenbeschränkung eines UIView programmgesteuert aktualisieren?

102

Ich habe eine UIViewund ich habe die Einschränkungen mit Xcode Interface Builder festgelegt.

Jetzt muss ich diese Höhenkonstante UIView'sprogrammgesteuert aktualisieren .

Es gibt eine Funktion, die so aussieht myUIView.updateConstraints(), aber ich weiß nicht, wie ich sie verwenden soll.

Chris Mikkelsen
quelle
Nehmen Sie den Auslass der Höhenbeschränkung und stellen Sie programmgesteuert ein
iMuzahid
Sie können diesen Link oder diesen Link als Referenz verwenden.
Amna Farhan
Hier ist eine Möglichkeit, einzelne oder mehrere Einschränkungen zu aktualisieren. stackoverflow.com/a/54171693/8861442
Sarath Kumar Rajendran

Antworten:

215

Wählen Sie die Höhenbeschränkung im Interface Builder aus und nehmen Sie einen Auslass davon. Wenn Sie also die Höhe der Ansicht ändern möchten, können Sie den folgenden Code verwenden.

yourHeightConstraintOutlet.constant = someValue
yourView.layoutIfNeeded()

Methode updateConstraints()ist eine Instanzmethode von UIView. Dies ist hilfreich, wenn Sie die Einschränkungen programmgesteuert festlegen. Es aktualisiert die Einschränkungen für die Ansicht. Für mehr Details klicken Sie hier .

Parth Adroja
quelle
58
Heute habe ich gelernt, dass Constraints in eine Steckdose verwandelt werden können, und von dort aus kann ich tun, was ich will. Danke
Chris Mikkelsen
@ParthAdroja, Bruder, könnten Sie bitte einen Blick auf meine Frage stackoverflow.com/questions/46034278/… werfen ?
Mai Phyu
Ich habe keine xib-Datei und wie kann ich yourHeightConstraint programmgesteuert in einer UIView festlegen?
Newszer
@newszer Sie müssen zu einem anderen Thema für diesen stackoverflow.com/questions/31651022/…
Parth Adroja
Ich habe gehört, dass wir layoutIfNeeded nach Änderung der Konstantenaufforderung aufrufen sollten. Warum? und manchmal rufe ich layoutIfNeeded in viewWillLayoutSubviews und viewDidLayoutSubviews auf. Ist es okay?
Mnemonik23
104

Wenn Sie eine Ansicht mit mehreren Einschränkungen haben, ist dies viel einfacher, ohne mehrere Ausgänge erstellen zu müssen:

Geben Sie im Interface Builder für jede Einschränkung, die Sie ändern möchten, einen Bezeichner an:

Geben Sie hier die Bildbeschreibung ein

Dann können Sie im Code mehrere Einschränkungen wie folgt ändern:

for constraint in self.view.constraints {
    if constraint.identifier == "myConstraint" {
       constraint.constant = 50
    }
}
myView.layoutIfNeeded()

Sie können mehreren Einschränkungen denselben Bezeichner geben, sodass Sie Einschränkungen zusammenfassen und alle gleichzeitig ändern können.

George Filippakos
quelle
Dies funktioniert gut, aber ich finde es einfacher, nur eine reguläre Outlet-Sammlung zu verwenden, um die Einschränkungen zu gruppieren. In der Ansicht, mit der ich arbeite, gibt es beispielsweise 47 Einschränkungen, aber nur 6, die ich zur Laufzeit ändern möchte, sodass es sich um eine viel kleinere Schleife handelt. Dies erfordert auch nicht, dass die Zeichenfolgen zwischen zwei verschiedenen Stellen synchron gehalten werden.
Gary Z
1
Danke George für diesen Tipp. Es ist eine echte Hilfe bei einigen aktuellen Layouts, mit denen ich spiele.
Jim Hillhouse
1
SCHÖN
William Yang
Hallo, ich benutze es auf die gleiche Weise, aber es geht nie in den if-Fall und ich habe die gleiche Kennung angegeben.
Rob13
Ich habe mich gefragt, ob es möglich ist, Einschränkungen zu benennen. Gute Antwort!
ShadeToD
35

Ändern HeightConstraintund WidthConstraintohne zu schaffen IBOutlet.

Hinweis: Weisen Sie in Storyboard- oder XIB-Dateien Höhen- oder Breitenbeschränkungen zu. nach dem Abrufen dieser Einschränkung mit dieser Erweiterung.

Mit dieser Erweiterung können Sie eine Höhen- und Breitenbeschränkung abrufen:

extension UIView {

var heightConstraint: NSLayoutConstraint? {
    get {
        return constraints.first(where: {
            $0.firstAttribute == .height && $0.relation == .equal
        })
    }
    set { setNeedsLayout() }
}

var widthConstraint: NSLayoutConstraint? {
    get {
        return constraints.first(where: {
            $0.firstAttribute == .width && $0.relation == .equal
        })
    }
    set { setNeedsLayout() }
}

}

Sie können verwenden:

yourView.heightConstraint?.constant = newValue 
AshvinGudaliya
quelle
2
Es gibt eine Methode, die first(where: ...)Sie sofort anstelle von filter+first
Vyachaslav Gerchicov
13

Ziehen Sie die Einschränkung als IBOutlet in Ihre VC. Anschließend können Sie den zugehörigen Wert (und andere Eigenschaften; siehe Dokumentation) ändern:

@IBOutlet myConstraint : NSLayoutConstraint!
@IBOutlet myView : UIView!

func updateConstraints() {
    // You should handle UI updates on the main queue, whenever possible
    DispatchQueue.main.async {
        self.myConstraint.constant = 10
        self.myView.layoutIfNeeded()
    }
}
Dylanthelion
quelle
9

Sie können Ihre Einschränkung mit einer reibungslosen Animation aktualisieren, wenn Sie möchten. Weitere Informationen finden Sie im folgenden Codeabschnitt:

heightOrWidthConstraint.constant = 100
UIView.animate(withDuration: animateTime, animations:{
self.view.layoutIfNeeded()
})
Hafiz Muhammad Farooq Rasheed
quelle
4

Wenn die obige Methode nicht funktioniert, stellen Sie sicher, dass Sie sie im Block Dispatch.main.async {} aktualisieren. Sie müssen dann nicht die layoutIfNeeded () -Methode aufrufen.

Nupur Sharma
quelle
4

Verbinden Sie zuerst die Höhenbeschränkung mit unserem Viewcontroller, um IBOutlet wie im folgenden Code zu erstellen

@IBOutlet weak var select_dateHeight: NSLayoutConstraint!

Setzen Sie dann den folgenden Code in die Ansicht, die geladen wurde, oder in Aktionen

self.select_dateHeight.constant = 0 // we can change the height value

Wenn es sich innerhalb einer Schaltfläche befindet, klicken Sie

@IBAction func Feedback_button(_ sender: Any) {
 self.select_dateHeight.constant = 0

}
Nimisha Joshy
quelle
1

Um eine Layouteinschränkung zu aktualisieren, müssen Sie nur die Konstanteneigenschaft aktualisieren und danach layoutIfNeeded aufrufen.

myConstraint.constant = newValue
myView.layoutIfNeeded()
Fran Martin
quelle
1
Create an IBOutlet of NSLayoutConstraint of yourView and update the constant value accordingly the condition specifies.

//Connect them from Interface 
@IBOutlet viewHeight: NSLayoutConstraint! 
@IBOutlet view: UIView!

private func updateViewHeight(height:Int){
   guard let aView = view, aViewHeight = viewHeight else{
      return
   }
   aViewHeight.constant = height
   aView.layoutIfNeeded()
}
CrazyPro007
quelle