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ć.
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ć.
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ń 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
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()
}