Mam UIView
i ustawiam ograniczenia za pomocą Xcode Interface Builder.
Teraz muszę UIView's
programowo zaktualizować tę stałą wysokości.
Jest funkcja, która działa jak myUIView.updateConstraints()
, ale nie wiem, jak jej używać.
Mam UIView
i ustawiam ograniczenia za pomocą Xcode Interface Builder.
Teraz muszę UIView's
programowo zaktualizować tę stałą wysokości.
Jest funkcja, która działa jak myUIView.updateConstraints()
, ale nie wiem, jak jej używać.
Odpowiedzi:
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 .
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ć:
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.
Zmień HeightConstraint
i WidthConstraint
bez 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
first(where: ...)
możesz użyć natychmiast zamiast filter
+first
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()
}
}
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()
})
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 ().
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
}
Aby zaktualizować ograniczenie układu, wystarczy zaktualizować stałą właściwość i wywołać layoutIfNeeded po.
myConstraint.constant = newValue
myView.layoutIfNeeded()
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()
}