iphone - for - keynote download
PresentaciĆ³n y dimensionamiento de las subvistas en un UIViewController (2)
Tengo una aplicación con un UITabController
y cada pestaña es un UINavigationController
. La raíz de uno de mis UINavigationControllers
es un UIViewController
.
Dentro de la vista del controlador de vista, quiero diseñar algunas subvistas, pero estoy confundido en cuanto a dónde y cómo presentarlas de una manera que será independiente de la resolución (es decir, no valores de código duro como 320px, 480px, 44px, etc. )
Cuando la vista está completamente cargada y presentada en un iPhone vertical, su altura será 367px = 480 - 20 (barra de estado) - 44 (barra de navegación) - 49 (barra de pestañas).
Dentro del controlador de vista, actualmente creo todas mis subvistas dentro del método viewDidLoad
. Sin embargo, parece que dentro de este método, la altura actual de la vista es 460px ( self.view.bounds.size.height
). Entonces, al configurar mis subvistas, no puedo calcular correctamente los tamaños de nada.
Dentro del método viewWillAppear:
la vista sabe su tamaño adecuado, pero eso significará establecer y calcular los fotogramas de la subvista cada vez que aparezca la vista (por ejemplo, cambios de pestaña o popping de los controladores de vista secundarios en la pila de navegación).
¿Es la única forma de hacer esto correctamente para el diseño en viewWillAppear:
:?
He intentado usar las propiedades de aumento automático (los autoresizesSubviews
y autoresizingMask
) pero parece que no funcionan en absoluto? ¿Esto solo tiene efecto una vez que la vista está configurada y luego cambia el tamaño (manualmente / cambio de orientación?).
Estaría agradecido si alguien pudiera decirme por qué el ajuste automático no funciona, y cuál es la mejor manera de presentar las cosas sin codificar en modo alguno los tamaños.
Puede hacer su lógica de diseño dentro de viewWillLayoutSubviews
del UIViewController
.
-(void)viewWillLayoutSubviews{
[super viewWillLayoutSubviews];
// Your layout logic here
}
DOC: se llama justo antes de que se invoque el método layoutSubviews de la vista del controlador de la vista. Las subclases pueden implementarse según sea necesario. El valor predeterminado es un nop.
autoresizesSubviews
debe establecerse en su vista principal, mientras que el autoresizingMask
debe establecerse en las vistas secundarias; este es el error que cometí, por lo que también podría hacerlo.
En loadView
debe dimensionar sus subvistas para que se ajusten a cualquier tamaño de vista principal en este momento, y luego cuando la vista principal se redimensiona de 460 a 367 píxeles, sus sub-vistas también se redimensionarán, de acuerdo con la configuración de su máscara anterior.
Si eso falla, no hay nada de malo en establecer el tamaño de la vista en viewWillAppear
; el impacto en el rendimiento de hacerlo cada vez es insignificante.
Si nada más funciona, siempre hay layoutSubviews:
- allí puede hacer el diseño manual si es necesario, se invoca cuando el sistema cree que el diseño puede tener que cambiar. también hay setNeedsLayout
: que a veces invoco desde viewWillRotate:
/ viewDidRotate
: etc. Pero en realidad esto no debería ser necesario y el autoresize debería ser lo suficientemente bueno.
EDITAR: Sí, para implementar la lógica de diseño personalizado en layoutSubviews
como mencioné anteriormente, uno necesitaría subclasificar a UIView
.