2014-12-31 14 views
17

Ho cercato su Google ma non ho trovato risposta. Quindi ho bisogno di chiedere. Ho una schermata principale. Quando l'utente ha effettuato l'accesso, visualizzerà una vista simile a quella seguente. enter image description here Ora, quando l'utente si disconnette e visita la pagina iniziale, vedrà il layout sopra, ma senza il riquadro centrale. Se imposto Quel layout nascosto ora viene visualizzato come segue. enter image description hereCome rimuovere i vincoli a livello di programmazione che viene aggiunto dallo storyboard?

voglio passare terzo layout di po 'sopra per rimuovere lo spazio bianco ..

ho aggiunto i vincoli utilizzando storyboard. Ora è necessario rimuovere i vincoli dalla programmazione e aggiungere un vincolo che imposterà il layout al secondo layout.

+0

Vedere questo blog: http://stackoverflow.com/questions/17867125/uistoryboard-how-to-replace-constraints-programmatically –

+0

@Mrunal. Sì, sto lavorando su di esso in realtà .. Sto ricevendo alcuni avvertimenti sui vincoli nel registro .. – Dharmik

risposta

9

Prendere l'IBOutlet del vincolo di altezza della vista che si desidera nascondere quando l'utente si disconnette.

@property(weak, nonatomic) IBOutlet NSLayoutConstraint *viewHeight; 

C'è una proprietà costante in NSLayoutConstraint classe. È necessario impostarlo quando l'utente esegue l'accesso/si disconnette.

viewHeight.constant = isLoggedIn ? 30.0 : 0.0; 

Spero che questo aiuti ..

19

Come @Henit detto, è possibile impostare IBOutlet per i vincoli pure.

Per esempio,

@property(weak, nonatomic) IBOutlet NSLayoutConstraint *viewHeight; 

così ora, è possibile rimuovere questo vincolo in questo modo:

[myView removeConstraint: viewHeight]; 

Oppure, se si desidera rimuovere tutti/più vincoli legati alla vista, allora,

[myView removeConstraints: constraintsArrayHere]; // custom array of constraints references 
[myView removeConstraints: [myView constraints]]; //all constraints 

Poi più tardi è possibile aggiungere i nuovi vincoli nello stesso modo utilizzando addConstraint o Metodo .

Per maggiori informazioni vai tramite Apple Documentazione here.

Spero che questo aiuti.

1

Puoi farlo anche in un altro modo. Aggiungi un vincolo di spaziatura verticale tra il terzo layout e il primo layout che sarà 30. Quindi aggiungi un riferimento al vincolo nel controller.

self.verticalSpacingFromThirdToFirstConstraint.constant = isLoggedIn ? 30.0 : 0.0 

PS: in questo caso non è necessario aggiungere un vincolo di altezza per la vista centrale. Basta aggiungere i quattro trailing, leading, top (al primo layout) e bottom (al terzo layout).

10

removeConstraints saranno deprecati in futuro.

È possibile utilizzare il seguente in alternativa

viewHeight.active = NO; 
0

È possibile aggiungere un vincolo di altezza per quella vista si desidera nascondere. E aggiungere uno sbocco NSlayoutHeightcontraint per quel limite di altezza nel file viewcontroller.h. Quindi puoi chiamare quella presa heightConstrain nel tuo file viewcontroller.m ovunque ti serva. Aggiungere questo codice in cui si desidera nascondere questo UIview:

_heightconstrainOutlet.constant=0; 

Farà quell'altezza diventano zero. Quindi la tua vista dal basso riguarderà anche quella zona. Se la tua vista dal basso aveva un vincolo di altezza e uno spazio inferiore al vincolo del contenitore? Basta rimuovere uno qualsiasi di essi come vostro requisito .grazie

8

di espandere @ risposta di Megamind: è possibile utilizzare la proprietà di activeNSLayoutConstraint. Basta impostare due diversi vincoli per i due casi e attivarne solo uno a seconda dello stato di accesso. Nel InterfaceBuilder la proprietà active stranamente chiamato Installed:

Login constraintRegister constraint

Poi nel vostro interruttore codice tra i due:

- (void)setupRegistrationView 
{   
    _loadingIndicatorTopConstraintLogin.active = NO; 
    _loadingIndicatorTopConstraintRegister.active = YES; 
} 

- (void)setupLoginView 
{   
    _loadingIndicatorTopConstraintLogin.active = YES; 
    _loadingIndicatorTopConstraintRegister.active = NO; 
} 

BTW, utilizzando il nuovo UIStackView può fornire una soluzione più elegante per il tuo caso, ma questo è un altro argomento.

+0

man salvatore! –

1

E 'abbastanza semplice da iOS 10+ si può semplicemente iterare su tutti i vincoli di una vista e disattivarlo. Se tu, ad es. vuole trovare e rimuovere il vincolo di altezza di una vista è possibile effettuare le seguenti operazioni:

for constraint in constraints { 
    guard constraint.firstAnchor == heightAnchor else { continue } 
    constraint.isActive = false 
    break 
} 

ALTERNATIVA
Si tratta anche di un one-liner. Se siete all'interno della vostra vista si può semplicemente scrivere:

constraints.first { $0.firstAnchor == heightAnchor }?.isActive = false 
+1

questo dovrebbe essere accettato – JohannaNoobie

Problemi correlati