2015-03-13 4 views
8

NSLayoutConstraint (in iOS 8.0) ha una struttura denominata BOOLactive che rende facile per abilitare/disabilitare suddetto vincolo di layout on-the-fly.Attivazione/Disattivazione NSLayoutConstraints in InterfaceBuilder

Per creare un secondo set di layout per un controller di visualizzazione che posso abilitare/disabilitare a livello di codice (tramite uno IBOutletCollection di NSLayoutConstraints per entrambi i set), sarà necessario disabilitare i vincoli di layout già definiti nel builder dell'interfaccia.

Consentitemi di cancellare qui NON desidero eliminarli, basta disabilitarli in modo da poter progettare un secondo set senza che il builder dell'interfaccia si lamenta sempre dei limiti di mancata corrispondenza. Inoltre, il passaggio a classi di dimensioni non è un'opzione, poiché i set di layout sono pensati per una stessa classe di dimensioni.

Esiste un'opzione per farlo?

Grazie in anticipo

Malte

Ulteriori informazioni: SDK Version: 8.1Deployment Target 8.0

risposta

18

Selezionare il vincolo che si desidera disabilitare in storyboard, e Opzione + Comando + per mostrare gli attributi Ispettore, quindi deselezionare Installato.

+8

Wow, grazie, ha funzionato, ma se deselezionassi installato li renderei inaccessibili in questa classe di dimensioni! Molte grazie! – Malte

+0

In Xcode 8 è necessario selezionare l'opzione "Usa variazione tratto" per abilitarlo. –

+0

@AmmarMujeeb Dove lo fai? – shim

10

Avevo già utilizzato con successo la soluzione fornita da Gabbler, ma recentemente ho provato la stessa cosa utilizzando Swift 2.0 e Xcode 7 e ho scoperto che non funzionava più. I vincoli impostati come non installati erano, come ci si potrebbe aspettare, non installati affatto e non avevano alcun effetto sul layout quando acceso o spento.

La mia soluzione al problema era di assicurare che tutti i vincoli fossero installati e di aggiungere un attributo di runtime definito dall'utente con la chiave 'active', tipo 'boolean' e valore 'false'.

Il pannello degli attributi di runtime definito dall'utente può essere trovato nell'Ispettore identità sotto i campi Classe personalizzata.

+0

Bel lavoro. Tuttavia, vengono comunque visualizzati tutti gli avvisi e gli errori di Interface Builder collegati a vincoli in conflitto. Mi chiedo perché non ci sia una casella di controllo per l'attributo attivo che risolverebbe questo genere di cose. – bjornorri

+1

Sì, non è particolarmente piacevole, ma non conosco una correzione completamente compatibile con IB. Speriamo che una versione futura di Xcode riconoscerà la necessità di questa impostazione. – Ash

+1

È possibile impostare sempre la priorità del vincolo contrassegnato come non attivo su 9999 per silenziare gli avvisi. – bencallis

0

La mia soluzione utilizzando Xcode 8 e Swift 3 senza ottenere eventuali avvisi non è stata selezionata la Installato scatola su Interface Builder, scheda ispettore:

Installed box on Interface builder

quindi creare l'IBOutlets e aggiungere/rimuovere loro programmazione su viewDidLayoutSubviews()

view.removeConstraints([constraints to remove, ...]) 
view.addConstraints([constraints to add, ...]) 

assicurarsi di rimuovere i vincoli prima, altrimenti si otterrà il registro dei messaggi Impossibile soddisfare simultaneamente i vincoli ...