2011-11-11 8 views
5

Tengo un UINavigationController simple. En el método init estoy creando y agregando un UITableView como una subvista.Descubriendo initWithFrame: self.view.frame Problema de 20 píxeles (barra de estado) de una vez por todas

- (id)init { 
    self = [super init]; 
    if (self) { 
     NSLog(@"%@", NSStringFromCGRect(self.view.frame)); // {{0, 20}, {320, 460}} 
     tableView = [[UITableView alloc] initWithFrame:self.view.frame]; 
     [self.view addSubview:tableView]; 
    } 
    return self; 
} 

Me parece que siempre encuentro el mismo problema molesto cuando trabajo con proyectos nuevos. Las subvistas agregadas terminan 20 píxeles debajo de la barra de navegación.

¿Por qué acabo con {{0, 20}, {320, 460}} para self.view.frame? No quiero forzar el marco de CGRect, preferiría configurarlo en función del marco del controlador de vista para no tener problemas con los cambios dinámicos de cuadros (anclaje a red, llamadas telefónicas, etc. donde la barra de estado es más alta) .

Actualización: También noté que obtengo una altura de 460 para el marco. Eso tampoco tiene sentido. En mi caso, en realidad tengo una barra de pestañas, por lo que la altura no debería ser menos la barra de estado, menos la barra de navegación y menos las alturas de la barra de pestañas.

Gracias

+1

porque la barra de estado de 20 píxeles de altura – SAKrisT

Respuesta

7

marco de UIView toma argumentos válidos sólo cuando -viewWillAppear, -viewDidAppear métodos se llaman. NO debe confiar en el marco y hacer cálculos con él antes.
Además no se debe utilizar (de otros objetos) view propiedad de UIViewController (UITableViewController) antes -viewDidLoad método se llama, lo que no debe utilizar la vista y añadir cualquier controlador a ella en init método, sólo en -loadView o (mejor) en -viewDidLoad . Agregue su subvista en estos métodos y configure su marco antes de la apariencia.
En la vista del ciclo de vida de viewController puede cargarse y descargarse muchas veces (por ejemplo, la vista descarga de descarga de documentos recuperados), la vista nunca se puede cargar en absoluto.

2

Está mezclando dos sistemas de coordenadas diferentes. El marco de self.view se define en el sistema de coordenadas de la ventana (o lo que sea que sea la vista principal). El marco de tableView se define en el sistema de coordenadas de self.view.

Si quieres algo para llenar toda la vista, establezca

subView.frame = parentView.bounds; 

límites se define en el propio sistema de coordenadas de un punto de vista. marco se define en el sistema de coordenadas de su vista principal. Entonces subView.frame y parentView.bounds son el mismo sistema de coordenadas.

Cuando establece subview.frame = parentView.frame, no terminan siendo lo mismo más de 20 gramos = 20 onzas. La vista principal tiene origen en (0, 20); la subvista tiene origen en (0, 20), pero en un sistema de coordenadas diferente. En el sistema de coordenadas de la ventana eso es (0, 40).

+0

Sí, gracias. Y de hecho, así es como está documentado en los documentos de desarrollo de Apple iOS: referencia de clase UIView> Propiedades> "límites" y "marco". –

Cuestiones relacionadas