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ć.



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 .


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.


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 

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

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

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


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

}

1

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

myConstraint.constant = newValue
myView.layoutIfNeeded()

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()
}
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.