Come aggiornare il vincolo di altezza costante di una UIView a livello di codice?


102

Ho un UIViewe ho impostato i vincoli utilizzando Xcode Interface Builder.

Ora ho bisogno di aggiornare quella UIView'scostante di altezza a livello di programmazione.

C'è una funzione che funziona come myUIView.updateConstraints(), ma non so come usarla.



puoi utilizzare questo collegamento o questo collegamento per i riferimenti.
Amna Farhan

Ecco un modo per aggiornare uno o più vincoli. stackoverflow.com/a/54171693/8861442
Sarath Kumar Rajendran

Risposte:


218

Seleziona il vincolo di altezza dal generatore di interfacce e prendine uno sfogo. Quindi, quando vuoi cambiare l'altezza della vista puoi usare il codice sottostante.

yourHeightConstraintOutlet.constant = someValue
yourView.layoutIfNeeded()

Il metodo updateConstraints()è un metodo di istanza di UIView. È utile quando si impostano i vincoli a livello di codice. Aggiorna i vincoli per la vista. Per maggiori dettagli clicca qui .


58
Oggi ho imparato che i vincoli possono essere trasformati in uno sfogo, e da lì posso fare tutto ciò che voglio fare con esso. Grazie
Chris Mikkelsen

@ParthAdroja, fratello potresti per favore dare un'occhiata alla mia domanda stackoverflow.com/questions/46034278/… ?
May Phyu

Non ho un file xib e come impostare yourHeightConstraint in un UIView a livello di codice?
newszer

@newszer è necessario guardare per altro argomento per quella stackoverflow.com/questions/31651022/...
Parth Adroja

Ho sentito che dovremmo chiamare layoutIfNeeded dopo la modifica del vincolo costante. perché? ea volte chiamo layoutIfNeeded all'interno di viewWillLayoutSubviews e viewDidLayoutSubviews. va bene?
mnemonic23

104

Se hai una vista con più vincoli, un modo molto più semplice senza dover creare più punti vendita sarebbe:

In Interface Builder, assegna a ciascun vincolo che desideri modificare un identificatore:

inserisci qui la descrizione dell'immagine

Quindi nel codice puoi modificare più vincoli in questo modo:

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

È possibile assegnare a più vincoli lo stesso identificatore, consentendo così di raggruppare i vincoli e modificarli tutti in una volta.


Funziona bene, ma trovo più facile utilizzare solo una normale collezione di outlet per raggruppare i vincoli. Ad esempio, nella vista con cui sto lavorando ci sono 47 vincoli ma solo 6 che voglio modificare in fase di esecuzione, quindi è un ciclo molto più piccolo. Inoltre, non è necessario mantenere le stringhe sincronizzate tra due luoghi diversi.
Gary Z

1
Grazie George per questo suggerimento. È un vero aiuto con alcuni layout attuali con cui sto giocando.
Jim Hillhouse

1
BELLISSIMO
William Yang

Ciao, lo sto usando allo stesso modo, ma non va mai nel caso if e ho dato lo stesso identificatore.
Rob13

Mi chiedevo se fosse possibile chiamare il vincolo. Bella risposta!
ShadeToD

35

Cambiare HeightConstrainte WidthConstraintsenza creare IBOutlet.

Nota: assegnare un vincolo di altezza o larghezza nel file Storyboard o XIB. dopo aver recuperato questo vincolo utilizzando questa estensione.

Puoi utilizzare questa estensione per recuperare un vincolo di altezza e larghezza:

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

}

Puoi usare:

yourView.heightConstraint?.constant = newValue 

2
C'è un metodo first(where: ...)che potresti usare immediatamente invece di filter+first
Vyachaslav Gerchicov

13

Trascina il vincolo nel tuo VC come IBOutlet. Quindi puoi modificare il suo valore associato (e altre proprietà; controlla la documentazione):

@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

Puoi aggiornare il tuo vincolo con un'animazione fluida, se lo desideri, vedi il pezzo di codice qui sotto:

heightOrWidthConstraint.constant = 100
UIView.animate(withDuration: animateTime, animations:{
self.view.layoutIfNeeded()
})

4

Se il metodo precedente non funziona, assicurati di aggiornarlo nel blocco Dispatch.main.async {}. Non è necessario chiamare il metodo layoutIfNeeded () allora.


4

Innanzitutto collega il vincolo di altezza al nostro viewcontroller per creare IBOutlet come il codice mostrato di seguito

@IBOutlet weak var select_dateHeight: NSLayoutConstraint!

quindi mettere il codice sottostante in vista ha caricato o all'interno di qualsiasi azione

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

se è all'interno di un pulsante fare clic

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

}

1

Per aggiornare un vincolo di layout è necessario solo aggiornare la proprietà costante e chiamare layoutIfNeeded dopo.

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()
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.