ios - UIViewController viewDidLoad ancho/altura incorrectos
uikit ios (3)
Todo el mundo sabe que no se puede confiar en el tamaño del marco en un método UIViewController init / viewDidLoad; esta:
- (void)viewDidLoad: {
NSLog(@"%d", self.view.frame.size.width);
}
imprimirá tamaños incorrectos en muchas ocasiones (en particular, está prácticamente roto en modo paisaje)
Esto realmente devolverá resultados siempre corregidos, por lo que es bueno diseñar las subvistas:
- (void)viewWillAppear: {
NSLog(@"%d", self.view.frame.size.width);
}
El problema es que se llama a viewWillAppears cada vez que aparece la vista, por lo que no es adecuado para asignar o agregar subvistas. Así que terminas declarando cada vista en la interfaz y terminas con enormes archivos de encabezado que no me gustan en absoluto, ya que la mayoría de los elementos no necesitan más manipulaciones después de la configuración inicial.
Entonces, la primera pregunta es: ¿hay una mejor manera de manejar el posicionamiento de las subvistas?
La segunda pregunta está muy relacionada, digamos que tengo una subclase de UIView que incluye varias otras subvistas. Lo declaro dentro de mi interfaz, y lo alloc / init en mi método init / viewDidLoad.
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
...
menu = [[SNKSlidingMenu alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height);
...
}
Como ya sabemos, ahora tenemos que reposicionarlo en vista de que va a aparecer para obtener una lectura más precisa
- (void)viewWillAppear:(BOOL)animated{
....
menu.frame = CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height);
....
}
El problema es que, por supuesto, todas las subvistas deben ser reposicionadas también. Esto se hace mediante la función layoutSubviews que se llama automáticamente, pero tenemos el mismo problema: todas las subvistas deben declararse dentro de la interfaz de la clase SNKSlidingMenu. ¿Hay alguna forma de evitar esto?
Gracias.
Si tiene como objetivo iOS 5.0 o superior, puede usar viewWillLayoutSubviews
y viewDidLayoutSubviews
para realizar cambios.
En cuanto a su segunda pregunta, si necesita acceder a una variable de instancia en otro método que no sea init
, debe mantenerlo, no veo ningún problema.
Sin embargo, puede intentar usar Diseños automáticos y establecer reglas entre las subvistas para que se configuren automáticamente sin la necesidad de mantener una referencia.
viewWillLayoutSubviews
y viewDidLayoutSubviews
pueden resolver este problema.
Pero los dos methed se realizarían más veces. este es mi código para obtener la self.view.frame
corrección.frame correcta.
- (void)viewDidLoad {
[super viewDidLoad];
...
dispatch_async(dispatch_get_main_queue(), ^{
// init you view and set it`s frame. this can get correct frame.
...
}
...
}
viewDidLoad
solo se viewDidLoad
cuando se crea su vista, pero muchas cosas pueden afectar el frame
del frame
, y no se vuelve a llamar cuando cambia el frame
.
En lugar:
- crear subvistas en
viewDidLoad
- establecer sus tamaños en
viewWillLayoutSubviews
.
Vea alguna discusión adicional aquí para manejar la rotación: https://.com/a/16421170/1445366