5

Tengo un UITabBarController que contiene un UINavigationController. Dentro de lo visible UIViewController, estoy creando una UITableView mediante programación de la siguiente manera:UITableView parcialmente oculto por UITabBar

self.voucherTableView = [[UITableView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame] style:UITableViewStylePlain]; 
self.voucherTableView.autoresizingMask = UIViewAutoresizingFlexibleHeight|UIViewAutoresizingFlexibleWidth; 

Sin embargo, el UITabBar es la superposición de la UITableView.

Cuando obtengo la altura del [[UIScreen mainScreen] applicationFrame], devuelve 460.00 mientras que debería ser 367.00.

En Interface Builder, estoy usando 'Simulated Metrics' que automáticamente establece el alto de la vista en 367.00.

Hay algo que me falta, no importa lo que intento, no puedo ver para obtener la altura de 367.00 que necesito.

Como una solución temporal, lo he instalado el marco de la UITableView manualmente, esto no es realmente ideal por lo que sería bueno para entender por qué esto no está funcionando:

self.voucherTableView = [[UITableView alloc] initWithFrame:CGRectMake(0, 0, 320, 367) style:UITableViewStylePlain]; 
+0

Tal vez debería consultar las AutoSizingMasks de la tabla View – ender

+0

He actualizado mi publicación original con lo que estoy estableciendo el valor 'autoresizingMask'. –

Respuesta

4

Usted debe use self.view.bounds en lugar de [[UIScreen mainScreen] applicationFrame] ya que el último le devuelve el marco de la pantalla completa, mientras que self.view.bounds le proporciona los límites de su vista que parece ser lo que está buscando.

+0

Intenté imprimir el valor de self.view.bounds.size.height y devolvió 460.00 nuevamente. –

+2

¿Dónde intentas hacerlo? Se actualizará en - (void) viewDidAppear: (BOOL) animado; (tal vez en - (void) viewWillAppear: (BOOL) animado; también, pero no estoy seguro al respecto) – Ariel

+0

Otra cosa que debes tener en cuenta es la propiedad wantsFullScreenLayout. Si lo configura en SÍ para su UIViewController, actualizará su vista de forma acorde sin tener en cuenta la barra de pestañas. – Ariel

2

se debe añadir la instancia UINavigationController a la UITabBarController y luego agregar un controlador de vista de tabla a la propiedad de la instancia rootViewControllerUINavigationController lo que debería hacer la vida mucho más fácil.

Como un ejemplo simple de esto, crea una aplicación vacía basada en una ventana (las plantillas hacen esto mucho más confuso de lo que realmente es).

Agregue sus subclases UIViewController/UITableViewController al proyecto y luego use este código como guía para configurar su proyecto. Este es el código de la clase AppDelegate:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    // create our table view controller that will display our store list  
    StoresViewController *storeListController = [[StoresViewController alloc] init]; 


    // create the navigation controller that will hold our store list and detail view controllers and set the store list as the root view controller 
    UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:storeListController]; 
    [navController.tabBarItem setTitle:@"TableView"]; 
    [navController.tabBarItem setImage:[UIImage imageNamed:@"cart.png"]]; 


    // create our browser view controller  
    BrowserViewController *webBrowserController = [[BrowserViewController alloc] init]; 
    [webBrowserController.tabBarItem setTitle:@"WebView"]; 
    [webBrowserController.tabBarItem setImage:[UIImage imageNamed:@"web.png"]]; 

    // add our view controllers to an array, which will retain them 
    NSArray *viewControllers = [NSArray arrayWithObjects:navController, webBrowserController, nil]; 


    // release these since they are now retained 
    [navController release]; 
    [storeListController release]; 
    [webBrowserController release]; 


    // add our array of controllers to the tab bar controller 
    UITabBarController *tabBarController = [[UITabBarController alloc] init]; 
    [tabBarController setViewControllers:viewControllers]; 


    // set the tab bar controller as our root view controller  
    [self.window setRootViewController:tabBarController]; 


    // we can release this now since the window is retaining it 
    [tabBarController release]; 


    [self.window makeKeyAndVisible]; 

    return YES; 
} 

En el ejemplo de código por encima de la BrowserViewController es una subclase de la clase UIViewController y StoresViewController es una subclase de UITableViewController. Las instancias UITabBarController y UINavigationController se crean mediante programación y se agregan a la ventana.

Al subclasificar la clase UITableViewController, evita tener que crear una instancia UITableView mediante programación y obtener la mayor parte de lo que necesita de fábrica.

Cuando tenga que empujar una vista de detalle en la pila del UINavigationController de ejemplo, sólo hay uso algo similar a esto:

[self.navigationController pushViewController:YourDetailViewControllerInstance animated:YES]; 

Esto añadirá la subclase vista de detalle UIViewController a jerarquía de vistas de la UINavigationController de ejemplo para usted y anima la transición.

Muchos de los controladores en esto, pero vale la pena y evitará muchos de los problemas que experimenta, ya que este método permite que las vistas administren el cambio de tamaño y tomen en cuenta las barras de herramientas/barras de navegación.