2013-03-19 31 views
26

Ho avuto un problema simile a this poster. E ho usato il suggerimento di jrturton per spostare il codice per personalizzare i pulsanti in viewDidLayoutSubviews. Si stava lavorando bene fino a quando ho ricevuto questo errore:Errore di layout automatico

'NSInternalInconsistencyException', reason: 'Auto Layout still required after sending -viewDidLayoutSubviews to the view controller. ViewController's implementation needs to send -layoutSubviews to the view to invoke auto layout.'

Sono molto all'oscuro sulla grafica, e l'unica cosa che riuscivo a pensare era di mettere [self.view layoutSubviews]; ma che non risolvere nulla. Ha funzionato quando ho deselezionato "Auto layout" nel mio Storyboard, ma questo ha cambiato le dimensioni dei miei pulsanti, e mi chiedevo se ci fosse un altro modo per risolverlo?

Codice:

-(void)viewDidLayoutSubviews { 
    NSArray *arrayOfButtons = [NSArray arrayWithObjects:self.decimalButton, self.buttonOne, self.buttonTwo, self.buttonThree, nil]; 

    for (UIButton *button in arrayOfButtons) { 

     [button setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal]; 
     [button setTitleColor:[UIColor redColor] forState:UIControlStateHighlighted]; 

     button.layer.borderWidth = 0.25f; 
     button.layer.borderColor = [[UIColor grayColor] CGColor]; 

     CAGradientLayer *btnGradient = [CAGradientLayer layer]; 
     btnGradient.frame = button.bounds; 
     btnGradient.colors = [NSArray arrayWithObjects: 
           (id)[[UIColor colorWithRed:122.0f/255.0f green:188.0f/255.0f blue:255.0f/255.0f alpha:1.0f] CGColor], 
           (id)[[UIColor colorWithRed:96.0f/255.0f green:171.0f/255.0f blue:248.0f/255.0f alpha:1.0f] CGColor], 
           nil]; 
     [button.layer insertSublayer:btnGradient atIndex:0]; 
    } 
} 
+1

E a proposito di chiamare '[super viewDidLayoutSubviews]'? I documenti dicono che l'implementazione di default non fa nulla, ma vale la pena provare. –

risposta

66

ho avuto questo problema di recente, quando ho voluto per regolare programmazione cornice della vista creata da storyboard, fornendo un gestore viewDidLayoutSubviews messaggio. Seguendo l'istruzione dal messaggio di eccezione, ho provato ad aggiungere [self.view layoutIfNeeded] alla fine di -viewDidLayoutSubviews, e poi ha funzionato.

+4

Sono confuso sul motivo per cui funziona. Sembra che questo dovrebbe finire in una ricorsione infinita, ma non è così. Dopo aver chiamato '[self.view layoutSubviews]', non sarebbe stato visualizzato 'viewDidLayoutSubviews', e così via? – Snowman

+2

La mia ipotesi è che ci siano diversi passaggi durante i quali i layout automatici "si sistemano", cioè sono progressivamente contrassegnati come soddisfatti o meno fino a quando non rimane alcuna ambiguità. –

+0

Mi hai salvato. Ho pensato che l'errore indicava che dovremmo chiamare esplicitamente 'layoutSubviews' * prima * la chiamata all'implementazione' super'. – user

Problemi correlati