Nessuna delle risposte di cui sopra ha lavorato completamente a me, se non viewDidLoad
ma che ha l'effetto collaterale di non mostrare quello che voglio fino a dopo che la vista si è animata, il che sembra scadente.
viewDidLayoutSubviews
dovrebbe essere il posto giusto per eseguire il codice che si basa sul layout automatico essere completo, ma come altri hanno fatto notare è chiamato più volte nelle versioni iOS recenti e non si può sapere quale è l'ultima chiamata.
Così ho risolto questo con un piccolo hack. Nel mio storyboard, mySubview
dovrebbe essere più piccolo del suo contenente self.view
. Ma quando viene chiamato per la prima volta viewDidLayoutSubviews
, mySubview
ha ancora una larghezza di 600, mentre self.view
sembra essere impostato correttamente (questo è un progetto per iPhone). Quindi tutto ciò che devo fare è monitorare le chiamate successive e controllare le larghezze relative. Una volta che mySubview
è inferiore a self.view
, posso essere sicuro che sia stato impostato correttamente.
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
if self.mySubview.bounds.size.width < self.view.bounds.size.width {
// mySubview's width became less than the view's width, so it is
// safe to assume it is now laid out correctly...
}
}
Questo ha il vantaggio di non fare affidamento su numeri hard-coded, in modo che possa funzionare su tutti i fattori di forma di iPhone, per esempio. Ovviamente potrebbe non essere una panacea in tutti i casi o su tutti i dispositivi, ma ci sono probabilmente molti modi ingegnosi per eseguire controlli simili delle dimensioni relative.
E no, non dovremmo doverlo fare, ma finché Apple non ci darà alcuni callback più affidabili, siamo tutti bloccati.
Ho provato a registrare il messaggio in 'viewDidLoad'. Quale metodo viene richiamato dopo che il layout automatico è stato completato. Il motivo per cui lo chiedo è perché voglio calcolare la larghezza prima che l'utente possa interagire con textView. Quindi la registrazione della descrizione dell'oggetto potrebbe non aiutare bcuz Voglio usare la larghezza per qualche altro calcolo. – user1046037
No, 'viewDidLoad' si verifica prima del layout automatico.Il layout automatico avviene pigramente dopo che una vista è stata aggiunta ad un'altra vista (che è stata chiamata poco dopo 'viewWillAppear', ma probabilmente non attendibilmente prima di' viewDidAppear'). L'unico modo affidabile per sapere è quando 'layoutSubviews' è finito sulla vista del controller della vista. – Jesper
Perché stai cercando di ottenere il frame comunque? Se vuoi fare calcoli basati su di esso e fare il layout te stesso, probabilmente finirai per combattere il layout automatico. – Jesper