2014-10-06 9 views
11

Ho un file xib che rappresenta una vista semplice con layout automatico che sto istanziando con [[NSBundle mainBundle] loadNibNamed:@"name"][0] e aggiungo a uno UIView creato in modo programmatico tramite addSubview:.XIB layout automatico incorporato in UIView programmatico senza ridimensionamento del padre

Il problema è che la vista non si estende per soddisfare le dimensioni della vista in cui è incorporata; piuttosto sembra essere il default alla dimensione che è stata specificata nel file xib. (Non riesco anche a trovare alcun modo per impostare i vincoli sulla vista contenitore stessa nel file xib, solo le sue sottoview.)

Anche in modo un po 'strano, quando ruoto l'iPad, la larghezza della vista si riduce ulteriormente proporzionalmente. Quindi è chiaramente cablato in qualche modo, ma con valori iniziali sbagliati.

Quale connessione mi manca per ottenere correttamente questa visualizzazione incorporata per adattarla alla gerarchia di viste?

Schermate (colorazione magenta aggiunto per il debug):

screenshot 1

Dopo aver girato a verticale:

screenshot 2

risposta

18

Il motivo per cui non viene ridimensionato per sé per riempire il suo nuovo superview è che non hai organizzato per farlo. In breve, è necessario aggiungere dei vincoli, nel codice, per mettere in relazione le due viste dopo averle aggiunte una all'altra.

Molto probabilmente, IB imposta la vista per tradurre la maschera di autoresizzazione in vincoli. Qual è la sua maschera autoresizing può essere difficile da determinare dal NIB quando è impostato per utilizzare il layout automatico.

In ogni caso, quando lo aggiungi alla superview, i vincoli generati automaticamente mantengono il frame corrente. Quando la superview si ridimensiona, la ridimensionano in base alla maschera autoresizing (probabilmente consentendo di variare la larghezza e l'altezza ma non la distanza dai bordi della superview).

Quando si utilizza il layout automatico, si dovrebbe effettuare le seguenti operazioni:

  • In entrambi i spegnere translatesAutoresizingMaskIntoConstraints nel pennino o spegnerlo nel codice che aggiunge al superview. Quale di questi approcci si prende dipende dal fatto che si anticipa che la vista verrà mai aggiunta come sottoview di una classe di visualizzazione del framework che gestisce il layout delle sue sotto-visualizzazioni. Se puoi, allora dovresti lasciarlo nella NIB e lasciare che la classe decida se disattivarla.

  • Dopo aver aggiunto la vista al suo superview, aggiungere vincoli alla superview che controlla dove la vista deve essere presentata.

+5

Grazie per l'aiuto. Peccato che Xcode non permetta di configurare i vincoli per questo nel generatore di interfacce. Normalmente mi piace fare cose nel codice, ma l'auto-layout non è sicuramente una di quelle cose. ;) Ho finito per installare la libreria ** PureLayout ** (https://github.com/smileyborg/PureLayout) e il suo metodo 'autoPinEdgesToSuperviewEdgesWithInsets' funziona alla grande. Saluti! – devios1

+2

Prego. I vincoli riguardano due viste. In una vista NIB, la superview non è presente, quindi non c'è nulla per i vincoli a cui fare riferimento. Inoltre, i vincoli dovrebbero essere aggiunti alla superview, non alla vista nella NIB.Infine, un caso d'uso importante per una vista NIB è per le viste che possono essere utilizzate in vari contesti. Non è appropriato per il punto di vista stabilire in che modo si relazionerà ai suoi dintorni in contesti arbitrari. Questo è un lavoro per il controller che lo carica e lo aggiunge in un'altra gerarchia di viste. –

+0

Non so se 3 anni ha cambiato questo, ma quando hai detto "In una vista NIB, la superview non è presente", ho pensato: ma in uno storyboard in cui una visione di quella classe è stata inserita in una scena , ci dovrebbero essere abbastanza informazioni lì per determinare quella superview. IMHO, IB dovrebbe solo gestirlo. A meno che non manchi qualcosa e la gente di Xcode si limita a scrollare le spalle e dice che non vale la pena il nostro tempo per aggiungere quella capacità. –

Problemi correlati