2012-01-15 8 views
9

Esto parecía bastante simple cuando lo configuré, pero no puedo explicar por qué este espacio está presente entre la barra de estado y la barra de navegación. Además, la vista contenida parece que puede alinearse correctamente, y es solo la barra de navegación la que se desplaza hacia abajo. La brecha se parece al tamaño de la barra de estado, así que espero que tenga algo que ver con eso, pero no sé qué.UINavigationController tiene un espacio de barra de estado adicional en la parte superior

Nav Bar with extra space

Este es el código para configurar el controlador de navegación:

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    advancedVC = [[AdvancedSearchFormVC alloc] initWithNibName:@"AdvancedSearchForm" bundle:nil]; 
    UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:advancedVC]; 
    nav.navigationBar.tintColor = [UIColor defaultNavBarTint]; 
    nav.navigationBar.topItem.title = NSLocalizedString(@"SearchTitle", nil); 
    UIBarButtonItem *searchButton = [[UIBarButtonItem alloc] initWithTitle:NSLocalizedString(@"SearchButton", nil) style:UIBarButtonItemStylePlain target:self action:@selector(refreshPropertyList:)];   
    nav.navigationBar.topItem.rightBarButtonItem = searchButton; 

    self.view = nav.view; 
} 

El RootViewController utiliza una vista desde un archivo xib, donde he simulado la barra de estado, la barra de navegación, y la barra de pestañas.

+0

Tenga en cuenta que esta es un área donde existen diferencias entre iOS 5 y versiones anteriores. Si usa el diseño "enlatado" para el controlador de navegación, es bastante portátil, pero si lo ha personalizado del todo, las cosas saltan bastante entre las dos versiones. (Nunca he descifrado cuál es la diferencia, pero lo que estás mostrando es típico para el código iOS 4 que se ejecuta en iOS 5.) –

+0

ver esta primera respuesta a esta pregunta http://stackoverflow.com/questions/5850705/why-do-navigation-appear-20-pixels-below-status-bar-in-the-view – CarmeloS

Respuesta

0

El problema se resolvió mediante la fijación de la forma en que se insertó el controlador de navegación. En lugar de insertarlo en una vista que se había colocado en el controlador tabbar, el controlador de navegación debería haberse colocado directamente en el controlador de navegación.

advancedSearchFormVC = [[AdvancedSearchFormVC alloc] initWithNibName:@"AdvancedSearchForm" bundle:nil]; 
UINavigationController *searchNavController = [[UINavigationController alloc] initWithRootViewController:advancedSearchFormVC]; 

Este es sólo un controlador que está en el controlador de barra de pestañas, en sustitución de la advancedSearchFormVC al mismo tiempo. Luego, este controlador de navegación se agregó a la matriz de controladores que se puso en el controlador tabbar.

Disculpe por cualquier problema, pero este fue uno de esos problemas que puedo ver directamente y no verlo. Debería haberlo visto antes, porque ya tenía otro controlador de navegación en el controlador tabbar, y estaba configurado de la misma manera.

Gracias por su ayuda.

+2

Jim - No estoy siguiendo exactamente tu solución. ¿Puedes publicar el código para mostrar la solución real, por favor? – DoctorG

0

Desde va a añadir advancedVC como subvista de self.view, que se está añadiendo el interior del marco de self.view la que supongo que ya está compensando la barra de estado.

es probable que pueda solucionar este añadiendo esta línea:

nav.view.frame = self.view.frame; 

Justo encima de esta línea:

self.view = nav.view; 

-

Otros Pensamientos

estoy no está enterado de toda su configuración, pero self.view puede no ser necesario en absoluto. Simplemente haga que su instancia advancedVC sea la rootViewController de la instancia UIWindow que figura en su delegado de la aplicación.

7

Tuve el mismo problema antes. El código que utiliza para agregar UINavigationBar a UIViewController:

UINavigationController *nc = [[UINavigationController alloc] initWithRootViewController:self]; 
[self.view addSubview:nc.view]; 

Solución:
Marque la casilla "quiere Pantalla completa" con los atributos de su inspector de UIViewController.

10

El problema es que el controlador de navegación siempre espera dejar espacio para la barra de estado, que es la brecha de 20 píxeles.Busqué alrededor por un tiempo antes de encontrar esta solución que funciona:

//nav is assumed to be a subclass or instance of UINavigationController 
nav.view.frame = CGRectOffset(nav.view.frame, 0.0, -20.0); 
//you can then add the navigation's view as a subview to something else 

Originalmente había encontrado una respuesta que hizo este desplazamiento a la opinión del navigationbar, pero no funcionó. Funciona cuando lo haces a la vista real de los controladores de navegación.

Utilizo esta técnica para agregar un controlador de navegación de otra punta a una vista vacía de mi plumilla principal, por lo que puedo ubicarlo en cualquier lugar dentro de la pantalla principal como una subvista. Al utilizar una vista vacía como marcador de posición y marco de posicionamiento en mi plumilla principal, creo una punta y una clase separadas para administrar la navegación, que administra otras puntas usadas para manejar sus pantallas. De esta forma puedo resolver el clásico "cómo agrego un banner, imagen o vistas personalizadas sobre mi controlador de navegación" mientras tengo un controlador de navegación como subvista ... en iOS 5 para ser específico.

También vale la pena mencionar que utilizo el delegado de la aplicación para almacenar y acceder a todos los demás controladores, por lo que son retenidos por una instancia persistente a la que puedo acceder desde cualquier clase. Cree y sintetice algunas propiedades en la aplicación delegada de todos sus controladores, y en viewDidLoad cree instancias. De esa manera puedo hacer referencia a todos los controladores usados ​​en mi aplicación más tarde en cualquier lugar mediante la adición:

//this shows how to store your navigation controllers in the app delegate 
//assumes you've added 2 properties (UINavigationController*)"navController" and (UIViewController*)"rootController" in your app delegate 
//...don't forget to add #import "AppDelegate.h" to the top of the file 

AppDelegate *app = (AppDelegate*)[[UIApplication sharedApplication] delegate]; 
[app.navController pushViewController: app.rootController animated:YES]; 
//now apply the offset trick to remove the status gap 
app.navController.view.frame = CGRectOffset(app.navController.view.frame, 0.0, -20.0); 
+0

han encontrado la misma solución, pero no estoy contento con eso ... – iWheelBuy

+0

@Ali gracias por la solución! ¡realmente grandioso! – gaussblurinc

1

Como todos sabemos a estas alturas, el turno es de 20 píxeles para proporcionar espacio para la barra de estado en la parte superior. Pero de hecho, el sistema de coordenadas del controlador de vista se mantiene en su lugar y solo el marco de la barra de navegación se desplaza 20 píxeles hacia abajo. Esto hace que la barra de navegación se superponga a los 20 píxeles superiores de la vista.

registro del origen barras de navegación marco, se mostrará (0,0, 20,0)

Así que la solución es simplemente cambiar la posición de origen de la barra de navegación (0.0, 0.0) en viewWillAppear.

self.navigationController.navigationBar.frame = CGRectMake(0.0, 0.0, self.navigationController.navigationBar.frame.size.width, self.navigationController.navigationBar.frame.size.height); 
7

Usted puede tratar de establecer el atributo Bajo Top Baressin marcar de Atributos sección del UIViewController.

+0

Esto funcionó para mí, gracias. –

0

El problema es que UINavigationController.view debería agregarse a la vista superior. Solo encuentra el que está arriba y estará funcionando bien.

Cuestiones relacionadas