2011-09-20 19 views
18

Come determinare in modo coerente la dimensione corretta per il layout della vista in loadView?Determina la dimensione corretta in loadView

Ho diversi casi in cui un UIViewController viene inviato a un UINavigationController, o un UITabBarController è presente, o entrambi. Questi elementi modificano l'area dello schermo disponibile e la rendono incoerente se utilizzo i valori del codice.

Nel momento in cui loadView viene chiamato e voglio sapere come dimensionare la vista contenitore, aggiungo i miei subviews a.

Ho esaminato la guida di UIViewController e Apple utilizza UIScreen mainScreen applicationFrame, ma nel loro esempio ciò avviene perché sta facendo un'app a schermo intero.

Ho visto alcune risposte qui, ma nessuna che indirizzi come fare in modo coerente.

Grazie per l'aiuto fornito.

+1

Perché non utilizzare le maschere di ridimensionamento automatico? – Krumelur

risposta

-1

Ho creato un'app, carica diverse UITextViews, UIButtons e un controllo UISegment. Quello che ho fatto in viewWillAppear, chiamo un metodo di ridimensionamento che ho creato.

Cambia le dimensioni di tutte le sottoview in UIViewController a livello di programmazione. Questo perché l'autoresizing in IB è solo così buono.

Nella mia funzione calcViewSize, ottengo le dimensioni come questa;

CGFloat width = [[UIScreen mainScreen] applicationFrame].size.width; 
CGFloat height = self.view.frame.size.height; //this will retrieve the frame we are drawn into. 

Poi a piedi attraverso ogni visualizzazione secondaria nella UIViewController che voglio ridimensionare, e cambiare la sua cornice. Ho delle proprietà per queste viste in IBOutlets, quindi so già quali sono le viste.

Utilizzare Interface Builder per ottenere le dimensioni.

Un'ultima nota: Per cambiare le dimensioni in IB, selezionare la vista, selezionare gli attributi ispettore, disattivare la barra di stato, ora in ispettore Dimensioni, è possibile ridimensionare la vista, ri-organizzare i tuoi subviews, e scrivere i numeri per inserire il codice.

+0

Ciao eSpecializzato, grazie per l'input. Il mio problema è più che non uso IB per queste viste, ma invece li posiziono in loadView. Se uso applicationFrame devo testare la presenza di una barra delle schede o di una barra di navigazione e calcolare la mia vista da quella. È abbastanza complicato da fare per ogni viewController spinto a un controller del contenitore. – RickiG

12
- (void) loadView { 
    //self.wantsFullScreenLayout = YES; //could add this for translucent status bars 
    UIView *view = [[[UIView alloc] initWithFrame:[UIScreen mainScreen].applicationFrame] autorelease]; 
    self.view = view; 
} 

Da Apple View Controller Programming Guide per la creazione di vista di programmazione:

  1. creare una sottofinestra radice che è dimensionato per adattarsi allo schermo. La vista radice funge da contenitore per tutte le altre viste associate al controller della vista. In genere, definisce la cornice per questa vista in modo che corrisponda alla dimensione della finestra dell'applicazione, che a sua volta dovrebbe riempire lo schermo . Tuttavia, il controller della vista regola anche le dimensioni del fotogramma necessarie per soddisfare la presenza di di viste assortite, ad esempio la barra di stato del sistema, una barra di navigazione o una barra delle schede. È possibile utilizzare un oggetto UIView generico, una vista personalizzata definita dall'utente o qualsiasi altra vista che può essere ridimensionata per riempire lo schermo con lo .

allora è un esempio che è simile a quello che ho scritto sopra.

+1

Questo non funziona: non è possibile accedere a self.view in loadView. – Eiko

+0

Ho aggiunto un secondo esempio di codice – bandejapaisa

+2

viewController non ha proprietà view in loadView - se chiamo [super loadView] ne otterrò uno, ma l'idea è di crearne una mia. – RickiG

0

La risposta "corretta" è probabilmente per creare una sottoclasse UIView personalizzata e eseguire tutto il posizionamento della vista della sottoview nella sovrascrittura di layoutSubviews.La sottoclasse verrebbe quindi assegnata a self.view in loadView.

Tuttavia, funziona anche con viewDidLoad per aggiungere una vista secondaria di dimensioni identiche a self.view. (Anche se dovresti essere preparato per questa visualizzazione per modificare le dimensioni. - L'impostazione corretta di autoresizingMask può essere un buon modo per farlo.)

12

Non è necessario conoscere la dimensione esatta. Un VC non dovrebbe essere dimensionato, è responsabilità del genitore. Basta creare un UIView con [[UIView alloc] init] come confermato dall'ingegnere di Apple UIKit Andy Matuschak su Twitter: https://twitter.com/andy_matuschak/status/365227892151558144

+2

Questo è corretto e la mia risposta precedente (ora cancellata) era in realtà sbagliata. Puoi anche usare 'self.view = [[UIView alloc] initWithFrame: CGRectZero];'. E non dimenticare di impostare 'self.view.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; 'se non si utilizza AutoLayout. Le maschere di autoresizing – Tafkadasoh

+0

non funzioneranno se la dimensione del fotogramma originale è 0, perché 0 * x = 0 :). La chiave è che non è necessario ridimensionare le dimensioni del controller di visualizzazione: il padre VC (o UIWindow se è il principale) lo farà per te. –

Problemi correlati