Ninguna de las respuestas anteriores trabajado por completo para mí, excepto viewDidLoad
pero que no tiene el efecto secundario de no mostrar lo que quiero hasta después de que la vista se haya animado, lo cual parece pobre.
viewDidLayoutSubviews
debería ser el lugar correcto para ejecutar código que se basa en el diseño automático de ser completa, pero, como otros han señalado que se llama varias veces en los últimos versiones de iOS y no se puede saber cuál es la última llamada.
Así que resolví esto con un pequeño truco. En mi guión gráfico, mySubview
debería ser más pequeño que el que contiene self.view
. Pero cuando se llama por primera vez a viewDidLayoutSubviews
, mySubview
todavía tiene un ancho de 600, mientras que self.view
parece estar configurado correctamente (este es un proyecto de iPhone). Entonces, todo lo que tengo que hacer es monitorear las llamadas subsiguientes y verificar los anchos relativos. Una vez que mySubview
es menor que self.view
, puedo estar seguro de que se ha distribuido correctamente.
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...
}
}
Esto tiene la ventaja de no depender de los números codificados de forma rígida, por lo que puede trabajar en todos los formatos de iPhone, por ejemplo. Por supuesto, puede no ser una panacea en todos los casos o en todos los dispositivos, pero probablemente haya muchas maneras ingeniosas de hacer comprobaciones similares de tamaños relativos.
Y no, no deberíamos tener que hacer esto, pero hasta que Apple nos proporcione algunas devoluciones de llamada más confiables, estamos todos atrapados con eso.
Intenté registrar el mensaje en 'viewDidLoad'. Qué método se invoca después de que se haya completado el diseño automático. La razón por la que pregunto es porque quiero calcular el ancho antes de que el usuario pueda interactuar con textView. Por lo tanto, registrar la descripción del objeto puede no ser útil porque quiero usar el ancho para otro cálculo. – user1046037
No, 'viewDidLoad' sucede antes del diseño automático.El diseño automático se realiza de forma perezosa después de que se haya agregado una vista a otra vista (que es poco después de que se haya llamado a 'viewWillAppear', pero probablemente no de manera confiable antes de' viewDidAppear'). La única forma confiable de saber es cuándo termina 'layoutSubviews' en la vista del controlador de vista. – Jesper
¿Por qué estás tratando de obtener el marco de todos modos? Si desea hacer cálculos basados en él y hacer el diseño usted mismo, probablemente terminará luchando contra el diseño automático. – Jesper