2011-09-27 10 views
38

Ho un UIView personalizzato che ha un frame dedicato e impostato manualmente per l'orientamento verticale e orizzontale perché i VM non funzionano nel mio caso.Come forzare layoutsubviews di UIView.

Ho impostato questa cornice in:

- (void)viewWillAppear:(BOOL)animated 

e funziona come previsto.

Il mio problema ora è che il mio UIView ha anche delle sottoview che hanno anche una posizione dedicata per il ritratto/paesaggio.

posiziono questi subviews in:

- (void)layoutSubviews 

Se ora lascio il mio viewController in esempio orientamento verticale, ruotare in orizzontale su un'altra viewController e quindi tornare a questa vistaController Vedo che la mia vista è stata ridimensionata correttamente, ma le sottoview della mia vista, che vengono posizionate in layoutSubviews non vengono riposizionate ma vengono ridimensionate in modo animato dopo la vista è già apparsa.

non faccio niente in viewDidAppear e ho già provato a chiamare

- (void)layoutIfNeeded 

Così come:

- (void)setNeedsLayout 

In viewWillAppear, ma non sembra cambiare nulla.

Qualche idea su cosa sto facendo male?

Grazie.

risposta

76

Aveva un problema simile oggi. Ho risolto in primo luogo denominando

  • -setNeedsLayout: Impostare la bandiera che la vista ha bisogno di layout, e poi chiamando
  • -layoutIfNeeded: Controllare la bandiera immediatamente e - come è stato impostato manualmente prima - come layoutSubviews risultato è chiamato.

Non so se questo è il modo migliore, ma funziona;)

+1

questo metodo sembra funzionare meglio della semplice chiamata self.view.layoutSubviews() –

+0

Chiamata layoutSubviews utilizzerà qualsiasi vincolo impostato per organizzare le visualizzazioni secondarie. Se ciò che stai facendo non utilizza i vincoli, dovrai impostare setNeedsLayout e quindi layoutIfNeeded per forzare immediatamente un aggiornamento del layout. – Toby

5

vorrei suggerire l'impostazione del fotogramma iniziale in viewDidLoad quindi modificando il telaio vista per le modifiche di orientamento in

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

Non è necessario alcun animazioni espliciti a layoutSubviews (non so se tu avessi qualsiasi, ma suonava come esso) come qualsiasi cambiamento di frame sarà sincronizzato con l'animazione di rotazione.

Quando fuori dallo schermo, l'orientamento deve ancora essere ruotato, quindi le vostre viste dovrebbero essere posizionate correttamente quando si ritorna di nuovo sullo schermo.

Mi raccomando anche di guardare la sessione WWDC 2010 123 "Building Animation Driven UI" che tratta questa roba in modo molto più dettagliato.

+0

che uso per la rotazione willAnimateRotationToInterfaceOrientation mio punto di vista, mentre sullo schermo, e funziona bene. Inoltre, non ho un'animazione esplicita in layoutSubviews, questo è il problema. Non animare le viste in modo esplicito, tuttavia animano. "Quando fuori dallo schermo l'orientamento dovrebbe ancora essere ruotato" .. davvero? non ha mai funzionato per me, ho sempre dovuto riposizionare in vistaWillAppear. Grazie per il suggerimento con la sessione, però, guarderò questa sessione al più presto. – myell0w

-1

Per me ciò che ha funzionato è [self.view setNeedsDisplay]. Questo richiama il ridisegno sull'intera vista.È anche possibile ridisegnare una vista selezionata chiamando setNeedsDisplay sulla vista particolare, che ho fatto nel mio caso e ha funzionato perfettamente.

+0

Ciò causa invece il metodo 'drawRect:'. –

2

a una rapida 3 @iOS 10.1

override func viewWillAppear(animated: Bool){ 

    //Doesn`t neeed to call super to work 
    view.setNeedsLayout() 
} 

piste perfette

Problemi correlati