2015-05-07 6 views
15

Nelle mie app sto lavorando molto con vincoli, nella maggior parte dei casi anche con animazioni. In determinate circostanze ho bisogno di rimuovere i vincoli e aggiungerne di nuovi.Modo corretto per eliminare un NSLayoutConstraint

Poiché è necessario supportare anche iOS 7, non sono in grado di utilizzare la proprietà active, che altrimenti sarebbe la soluzione per me.

Il modo per rimuovere i vincoli è utilizzare il metodo removeConstraint su un UIView.

E 'possibile creare un metodo come

constraint.remove() 

in modo da non dovete sapere che vista si prende cura sopra il vincolo?

risposta

5

ho finito per usare il metodo autoRemove fornito dalla libreria PureLayout: https://github.com/smileyborg/PureLayout

Questo metodo trova il commonSuperview utilizzando il firstItem o secondItem e rimuove il vincolo dal punto di vista corretto.

Il risultato è stato questo uno di linea:

containerTopConstraint.autoRemove() 
0

No, non che io sappia. La gestione automatica della vista host è stata disponibile solo in iOS8.

Una brutta implementazione può eseguire il loop su tutti i vincoli di tutte le viste per trovare la vista su cui è attiva.

Ma normalmente non dovrebbe essere difficile gestire i vincoli in modo da sapere sempre su quale vista sono definiti.

+0

Beh, questo è vero. So che è uno su due punti di vista. Ma non voglio scrivere queste dichiarazioni se ogni volta. Sarebbe meglio avere una soluzione pulita per questo. – Antoine

14

Quello che faccio è creare array dei vincoli che voglio essere in grado di aggiungere/rimuovere e utilizzare semplicemente il seguente:

@property NSMutableArray *newConstraints; 

Riempire il newConstraints

iOS7 e iOS 8:

[self.viewToChange addConstraints:self.newConstraints]; 
[self.viewToChange removeConstraints:self.newConstraints]; 

o solo iOS 8, utilizzare il nuovo meccanismo

[NSLayoutConstraint activateConstraints:self.newConstraints]; 
[NSLayoutConstraint deactivateConstraints:self.newConstraints]; 

Con questo è possibile applicare un set, rimuovere il set e applicare un nuovo set.

È inoltre possibile creare l'elenco iniziale dallo storyboard impostato se è possibile identificare quali vincoli sono quali.

+0

Questo non è un mio problema. Il 'viewToChange' è il problema, dal momento che non sempre so quale vista si prende cura dei vincoli. Ecco perché voglio semplicemente dire 'constraint.remove()' – Antoine

+0

scuse, frainteso. Una soluzione sarebbe quella di mappare tutti i vincoli che contano in un dizionario usando il loro 'identificatore' come chiave e vista come valore. È quindi possibile trovare la vista corrente cercando da Identif. Per i vincoli codificati a mano è possibile impostare l'identificatore nel codice. Puoi anche impostarlo da IB: vedi http: // StackOverflow.it/questions/27791597/is-there-a-way-to-add-an-identificatore-to-auto-layout-constraints-in-interface-buil –

+0

Potrei usare quell'identificatore per trovare il vincolo, ma come faccio trova la vista corretta usando quell'identificatore? – Antoine