Jak programowo zaktualizować ograniczenie stałej wysokości UIView?

102

Mam UIViewi ustawiam ograniczenia za pomocą Xcode Interface Builder.

Teraz muszę UIView'sprogramowo zaktualizować tę stałą wysokości.

Jest funkcja, która działa jak myUIView.updateConstraints(), ale nie wiem, jak jej używać.

Chris Mikkelsen
źródło
Pozbądź się
możesz użyć tego linku lub tego linku do odniesień.
Amna Farhan
Oto sposób na aktualizację jednego lub wielu ograniczeń. stackoverflow.com/a/54171693/8861442
Sarath Kumar Rajendran

Odpowiedzi:

218

Wybierz ograniczenie wysokości z kreatora interfejsów i weź z niego wyjście. Jeśli więc chcesz zmienić wysokość widoku, możesz użyć poniższego kodu.

yourHeightConstraintOutlet.constant = someValue
yourView.layoutIfNeeded()

Method updateConstraints()jest metodą instancji UIView. Jest to przydatne podczas programowego ustawiania ograniczeń. Aktualizuje ograniczenia dla widoku. Aby uzyskać więcej informacji, kliknij tutaj .

Parth Adroja
źródło
58
Dziś dowiedziałem się, że Ograniczenia można zamienić w ujście i stamtąd mogę robić z nimi co tylko zechcę. Dzięki
Chris Mikkelsen
@ParthAdroja, bracie, czy mógłbyś rzucić okiem na moje pytanie stackoverflow.com/questions/46034278/… ?
May Phyu
Nie mam pliku XIB i jak programowo ustawić yourHeightConstraint w UIView?
newszer
@newszer musisz spojrzeć na inny temat dla tego stackoverflow.com/questions/31651022/ ...
Parth Adroja
Słyszałem, że po zmianie stałego ograniczenia powinniśmy wywołać layoutIfNeeded. czemu? i czasami nazywam layoutIfNeeded inside viewWillLayoutSubviews i viewDidLayoutSubviews. czy to w porządku
mnemonic
104

Jeśli masz widok z wieloma ograniczeniami, znacznie łatwiejszym sposobem bez konieczności tworzenia wielu gniazd byłoby:

W kreatorze interfejsów podaj identyfikator każdemu ograniczeniu, które chcesz zmodyfikować:

wprowadź opis obrazu tutaj

Następnie w kodzie możesz modyfikować wiele ograniczeń, takich jak:

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

Możesz nadać wielu ograniczeniom ten sam identyfikator, umożliwiając w ten sposób grupowanie i modyfikowanie wszystkich jednocześnie.

George Filippakos
źródło
Działa to dobrze, ale łatwiej mi jest użyć zwykłej kolekcji outlet do grupowania ograniczeń. Na przykład w widoku, z którym pracuję, istnieje 47 ograniczeń, ale tylko 6, które chcę zmienić w czasie wykonywania, więc jest to znacznie mniejsza pętla. Nie wymaga to również synchronizacji ciągów znaków między dwoma różnymi miejscami.
Gary Z,
1
Dziękuję George za tę wskazówkę. Jest to prawdziwa pomoc w przypadku niektórych obecnych układów, z którymi gram.
Jim Hillhouse
1
PIĘKNE
William Yang
Cześć, używam go w ten sam sposób, ale nigdy nie działa w przypadku if i podałem ten sam identyfikator.
Rob13
Zastanawiałem się, czy można nazwać ograniczenie. Świetna odpowiedź!
ShadeToD
35

Zmień HeightConstrainti WidthConstraintbez tworzenia IBOutlet.

Uwaga: Przypisz ograniczenie wysokości lub szerokości w Storyboard lub pliku XIB. po pobraniu tego ograniczenia przy użyciu tego rozszerzenia.

Możesz użyć tego rozszerzenia, aby pobrać ograniczenie wysokości i szerokości:

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() }
}

}

Możesz użyć:

yourView.heightConstraint?.constant = newValue 
AshvinGudaliya
źródło
2
Jest metoda, której first(where: ...)możesz użyć natychmiast zamiast filter+first
Vyachaslav Gerchicov
13

Przeciągnij ograniczenie do swojego VC jako IBOutlet. Następnie możesz zmienić skojarzoną z nim wartość (i inne właściwości; sprawdź dokumentację):

@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
źródło
9

Jeśli chcesz, możesz zaktualizować swoje ograniczenie za pomocą płynnej animacji, zobacz fragment kodu poniżej:

heightOrWidthConstraint.constant = 100
UIView.animate(withDuration: animateTime, animations:{
self.view.layoutIfNeeded()
})
Hafiz Muhammad Farooq Rasheed
źródło
4

Jeśli powyższa metoda nie działa, upewnij się, że zaktualizujesz ją w bloku Dispatch.main.async {}. Nie musisz wtedy wywoływać metody layoutIfNeeded ().

Nupur Sharma
źródło
4

Najpierw podłącz ograniczenie wysokości do naszego kontrolera widoku, aby utworzyć IBOutlet, jak pokazano poniżej

@IBOutlet weak var select_dateHeight: NSLayoutConstraint!

Następnie umieść poniższy kod w widoku, który załadował się lub w jakimkolwiek działaniu

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

jeśli znajduje się wewnątrz kliknięcia przycisku

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

}
Nimisha joshy
źródło
1

Aby zaktualizować ograniczenie układu, wystarczy zaktualizować stałą właściwość i wywołać layoutIfNeeded po.

myConstraint.constant = newValue
myView.layoutIfNeeded()
Fran Martin
źródło
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
źródło