Domanda

In alcuni dei miei progetti applicativi o per solo alcuni UIViews, a seguito di un pushViewController navigationController, la mia nuova visualizzazione sarà spostata fuori dalla finestra per l'altezza della barra di stato. Di conseguenza, io metterò questo codice stub nel metodo viewDidLoad.

CGRect  frameAt = [self.view frame];
CGRect  statusBarFrame = [[UIApplication sharedApplication] statusBarFrame];
frameAt.origin.y += statusBarFrame.size.height;
[self.view setFrame: frameAt];

Non ha senso per me che questa è l'intenzione di XCode e Interface Builder, così ho il sospetto che sto facendo qualcosa di fondamentalmente sbagliato con l'SDK durante il mio disegno vista. Inoltre, in occasione raro che io non devo spostare mio punto di vista, io davvero non so quale sia la differenza tra i due approcci progettuali.

Si noti inoltre, che la maggior parte del tempo che cerco di progettare le mie opinioni con IB, con qualche personalizzazione minore.

Qualcun altro eseguito in questo e sanno quello che fanno per risolvere senza un tale stub codice?

È stato utile?

Soluzione

Ho usato href="http://developer.apple.com/iphone/library/samplecode/NavBar/index.html" rel="noreferrer"> codice di esempio NavBar di Apple per provare e riprodurre il problema.

l'applicationDidFinishLaunching è originariamente implementata in questo modo:

[window addSubview:navigationController.view];
[window makeKeyAndVisible];

Se cambio a questo:

UIViewController *shellController = [[UIViewController alloc] initWithNibName:nil bundle:nil];
[shellController.view addSubview:navigationController.view];
[window addSubview:shellController.view];
[window makeKeyAndVisible];

Allora ottengo il divario che appare.

Tuttavia, se solo faccio questo:

UIView *shell = [[UIView alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
[shell addSubview:navigationController.view];
[window addSubview:shell];
[window makeKeyAndVisible];

Poi tutto sembra normale.

Quindi credo che ogni controller di vista compenserà la sua vista se il controller della vista root. Ma il controller di navigazione sovrascrive questo comportamento per compensare la sua vista, indipendentemente dal fatto che sia il controller della vista root. Quindi direi che il tuo gap viene visualizzato perché hai un controller di navigazione da qualche parte inferiore nella gerarchia di quello che dovrebbe essere.

Altri suggerimenti

La cosa principale da tenere a mente è che un controller di vista imposterà il telaio della sua vista stessa. Questo è perché la quantità di spazio disponibile per la visualizzazione può variare durante la durata dell'applicazione, e solo il controller della vista sa come regolare telaio della visualizzazione appropriata. Esempi di quando la quantità di spazio cambia includono la barra di navigazione che cambia altezza, ruotando il dispositivo da verticale a orizzontale e la barra di stato può anche aumentare in altezza se l'utente sta prendendo una chiamata. A causa di questo non si deve modificare il telaio della vista se stessi.

Quindi, la prima cosa che devi si è rimuovere tutto il codice relative al modifiying telaio della vista.

Ora è necessario progettare le opinioni con la mentalità che la dimensione del frame potrebbe cambiare in qualsiasi momento. Questo significa che l'impostazione della proprietà il ridimensionamento automatico di ogni visualizzazione secondaria correttamente. Se fate questo, allora non importa se si attiva la navigazione e di stato bar simulate o no; sono solo lì per aiutarvi a vedere ciò che il risultato finale sarà simile nella maggior parte dei casi.

È possibile impostare la proprietà il ridimensionamento automatico di ogni visualizzazione secondaria in Interface Builder in Impostazioni Dimensioni (quello con l'icona del righello). Nell'animazione, il testo bianco rappresenta la vista principale del controller vista, il riquadro rosso rappresenta la visualizzazione secondaria attualmente selezionata. Si noterà che la visualizzazione secondaria è ancorato al nell'angolo in alto a sinistra della vista principale per impostazione predefinita. Questo va bene se la dimensione della vista non cambia mai, ma sappiamo che non è vero. Se si dispone di subviews che si desidera visualizzare in fondo non-importa-cosa, allora avete bisogno di giocare con il diagramma a sinistra. Il suo funzionamento è se è selezionata una delle quattro linee intorno al bordo, allora la distanza tra il bordo della vista di base e il bordo della sottomaschera è fisso. Quindi, se volete una visualizzazione secondaria appaia in fondo, è necessario assicurarsi che il più in basso viene selezionata la linea e non la parte superiore. Le due linee in mezzo influiscono se la dimensione della visualizzazione secondaria cambia quando le dimensioni di visualizzazione principale cambiamento. Così, per esempio, se si ha una vista tabella che si voleva occupare l'intera altezza dello schermo, si dovrebbe assicurarsi che la linea verticale interno è stato selezionato. Questo è chiamato il puntoni e molle modello.

Se si aggiunge subviews programatically è necessario impostare la proprietà autoresizingMask su ogni visualizzazione secondaria. Ecco una spiegazione .

Speranza che aiuta!

testo del link

Un bug simile è discusso qui.

è anche l'animazione insieme al NO? Provare a impostarlo su YES come questo ha risolto un problema simile che stavo affrontando.

La risposta di Moshy è stato molto utile, come ho finalmente capito il significato delle linee tratteggiate / solidi in IB per controllare le proprietà di ridimensionamento degli elementi UIView.

Tuttavia, regolando quelle proprietà non ha affrontato un problema simile che ho affrontato con uno dei miei punti di vista. Questo punto di vista ha avuto uno stato e barra superiore definito in IB. E 'stato un uno un po' pesante, contenente un UIWebView che caricare una stringa HTML all'interno viewWillAppear e pochi altri elementi dell'interfaccia.

Durante il caricamento della vista, se l'utente cambia improvvisamente l'orientamento del dispositivo da verticale ad orizzontale, tutti i contenuti della vista sposterebbe verso il basso per l'altezza della barra di stato. Il divario risultante tra i controlli di visualizzazione e superiormente rimarrebbe anche dopo tornando alla verticale.

Che finalmente risolto i miei problemi, e la mia capelli rimanenti, è stata aggiunta la riga:

    self.view.frame = [[UIScreen mainScreen] bounds];

all'interno di

-(void) willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration

Da quando i miei contenuti della visualizzazione sono tenuti in posizione nonostante i bruschi cambiamenti orientamento del dispositivo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top