Ora, Interface Builder consente all'utente di modificare dinamicamente la dimensione di ogni controller di visualizzazione nello storyboard, per simulare le dimensioni di un determinato dispositivo.
Prima di questa funzionalità, l'utente deve impostare manualmente ogni dimensione del controller di visualizzazione. Quindi il controller della vista è stato salvato con una certa dimensione, che è stata utilizzata initWithCoder
per impostare il frame iniziale.
Ora, sembra che initWithCoder
non usi la dimensione definita nello storyboard e definisci una dimensione di 1000x1000 px per la vista del viewcontroller e tutte le sue sottoview.
Questo non è un problema, perché le viste dovrebbero sempre utilizzare una di queste soluzioni di layout:
autolayout, e tutti i vincoli imposteranno correttamente le tue viste
autoresizingMask, che imposterà ogni vista a cui non è associato alcun vincolo ( nota che il layout automatico e i vincoli di margine sono ora compatibili nella stessa vista \ o /! )
Ma questo è un problema per tutte le cose di layout relative al livello di visualizzazione, come cornerRadius
, poiché né il layout automatico né la maschera di ridimensionamento automatico si applicano alle proprietà del livello.
Per rispondere a questo problema, il modo comune è usare viewDidLayoutSubviews
se sei nel controller o layoutSubview
se sei in una vista. A questo punto (non dimenticare di chiamare i loro super
metodi relativi), sei abbastanza sicuro che tutte le cose di layout siano state fatte!
Abbastanza sicuro? Hum ... non del tutto, ho osservato, ed è per questo che ho posto questa domanda, in alcuni casi la vista ha ancora la sua dimensione 1000x1000 su questo metodo. Penso che non ci sia risposta alla mia domanda. Per dare il massimo delle informazioni a riguardo:
1- succede solo quando disponi le celle! Nelle UITableViewCell
& UICollectionViewCell
sottoclassi, layoutSubview
non verrà chiamato dopo che le sottoviste sarebbero state disposte correttamente.
2- Come ha osservato @EugenDimboiu (si prega di votare la sua risposta se utile per te), invocando [myView layoutIfNeeded]
la sottoview non strutturata la impaginerà correttamente appena in tempo.
- (void)layoutSubviews {
[super layoutSubviews];
NSLog (self.myLabel); // 1000x1000 size
[self.myLabel layoutIfNeeded];
NSLog (self.myLabel); // normal size
}
3- A mio parere, questo è sicuramente un bug. L'ho inviato al radar (id 28562874).
PS: non sono di madrelingua inglese, quindi sentiti libero di modificare il mio post se la mia grammatica deve essere corretta;)
PS2: Se hai una soluzione migliore, sentiti libero di non scrivere un'altra risposta. Sposterò la risposta accettata.