2014-05-09 11 views
10

Ho un'app per iOS nella quale ho bisogno di sapere quando una nuova vista è completamente visibile sullo schermo; cioè, quando l'Autolayout ha terminato i suoi calcoli e la vista ha finito di disegnare.Esiste un metodo iOS che si attiva al termine di Autolayout?

ViewDidAppear sembra sparare molto prima che la vista sia completamente visibile. Se spengo Autolayout, i tempi sembrano allineare per quanto riguarda la percezione umana, ma ho bisogno di usare l'Autolayout in questo progetto (quindi questa non è una soluzione ... solo un test).

C'è qualche metodo che si attiva quando viene eseguito il calcolo automatico di Autolayout? O un altro metodo che si attiva quando la vista è REALMENTE visibile (dal momento che ViewDidAppear non funziona per questo)?

Grazie!

+0

E a proposito di 'viewDidLayoutSubviews'? –

risposta

3

Sto usando viewDidLayoutSubviews per questo. La documentazione di Apple dice: "Chiamato per notificare al controller della vista che la sua vista ha appena esposto le sue sottoview."

+2

'... Tuttavia, questo metodo non indica che i singoli layout delle viste secondarie della vista sono stati modificati. –

+0

Alcuni layout di visualizzazione secondaria continua a chiamare anche quando il controller della vista che lo contiene chiama viewDidLayoutSubviews. Le sottoview non dovrebbero essere strettamente accoppiate – sheetal

13

che segue può essere utilizzata per evitare chiamate multiple:

- (void) didFinishAutoLayout { 

    // Do some stuff here.  

    NSLog(@"didFinishAutoLayout"); 
} 

e

- (void) viewDidLayoutSubviews { 
    [super viewDidLayoutSubviews]; 


    [NSObject cancelPreviousPerformRequestsWithTarget:self 
           selector:@selector(didFinishAutoLayout) 
              object:nil]; 
    [self performSelector:@selector(didFinishAutoLayout) withObject:nil 
       afterDelay:0]; 
} 
+0

Anche se sembra un trucco e ci dovrebbe essere un modo migliore ... funziona e non riesco a trovare altre alternative! La ragione per cui ne ho bisogno è perché ho bisogno di dire quando una sottoview particolare ha finito di stendere in modo da poter usare le sue dimensioni, ma per quanto posso dire, non c'è modo. – aaroncatlin

+0

Anche se è una soluzione alternativa, penso che sia molto pulito. Buon lavoro! –

+0

Sono solo preoccupato per il ritardo. Potrebbe rompersi se il dispositivo sarà stressato –

0

Cosa ha funzionato nel mio caso è stata richiesta layout dopo ha cambiato un valore vincolo:

self.cnsTableviewHeight.constant = 50; 
    [self layoutIfNeeded]; 

In seguito per sostituire il layout Metodo di visualizzazione:

- (void) layoutSubviews { //This method when auto layout engine finishes 
    } 

È possibile chiamare setNeedsLayout anche al posto di layoutIfNeeded

0

Immagino attuazione viewDidLayoutSubviews è il modo corretto, ma ho usato un'animazione solo scrivere il callback di completamento all'interno dello stesso metodo.

someConstraint.constant = 100; // the change 

// Animate just to make sure the constraint change is fully applied 
[UIView animateWithDuration:0.1f animations:^{ 
    [self.view setNeedsLayout]; 
} completion:^(BOOL finished) { 
    // Here do whatever you need to do after constraint change 
}];