¿Cómo evitar que UINavigationBar cubra la parte superior de la vista en iOS 7?


99

Después de actualizar a Xcode 5, las barras de navegación en todas las vistas de mi aplicación se han desplazado hacia abajo. Aquí hay algunas capturas de pantalla, la primera muestra todo lo que hay en la vista a medida que se baja y la segunda muestra todo intacto. La barra de búsqueda debe comenzar donde está la barra de navegación.

Todo el contenido Todo el contenido inactivo

¿Alguien sabe cómo puedo solucionar esto?

editar: he probado esta recomendación anteriormente:

if ([self respondsToSelector:@selector(edgesForExtendedLayout)])
        self.edgesForExtendedLayout = UIRectEdgeNone;

Pero produce resultados muy extraños.

Intento de solución

Esto puede deberse a que tengo un "menú deslizante" debajo de este controlador de vista que aparece debido a la transparencia de la barra de navegación.


Aquí tienes otra solución para este problema. stackoverflow.com/a/51491645/10148333
Afonso

Respuestas:


234

Establezca la propiedad translúcida de la barra de navegación en NO :

self.navigationController.navigationBar.translucent = NO;

Esto evitará que la vista se enmarque debajo de la barra de navegación y la barra de estado.

Si tiene que mostrar y ocultar la barra de navegación, utilice

 if ([self respondsToSelector:@selector(edgesForExtendedLayout)])
    self.edgesForExtendedLayout = UIRectEdgeNone;   // iOS 7 specific

en tu viewDidLoadmétodo.


1
He colocado esto debajo, viewDidLoadsin embargo, no produce cambios.
Sam D20

13
hágalo en las funciones viewDidLayoutSubviews
Hindú

1
Agregar esto a viewDidLayoutSubviews funcionó. ¡Agradezco la ayuda caballeros!
Sam D20

Hola, alguna pregunta? o es un cumplido?
Hindú

1
self.edgesForExtendedLayout = UIRectEdgeNone; me ayudó
luky

32

De forma iOS 7predeterminada , el valor de la propiedad translúcida del controlador es SÍ, por lo que establece la propiedad translúcida NO para este problema.

self.navController.navigationBar.translucent = NO;

2
No hay una propiedad "navController". Utilice esto: self.navigationController.navigationBar.translucent = NO;
Gene Z. Ragan

creo el objeto navigtionbarcontroller en el delegado de la aplicación y le doy el nombre navController.
Sumit Mundra

21

Puede desactivar "Extender bordes" en el inspector de atributos del controlador de vista de esta pantalla (como se muestra en la imagen de abajo):

ingrese la descripción de la imagen aquí


12

Esto también funciona para Swift en iOS 8.1

navigationController?.navigationBar.translucent = false

8

Si desea mantener la translucidez en su navigationBar, al final de su viewDidLoado en su viewWillAppearagregue esta línea de código:

[self.view sendSubviewToBack:self.tableView]

De alguna manera, si su scrollViewsubclase ( UITableView, UICollectionView, etc.) está en index0 en su visión actual subviews, que se ajustan automáticamente las inserciones de acuerdo a su navigationBar. Y tampoco debería afectar su interfaz de usuario en versiones anteriores a iOS7.


EDITAR Si inicializa su UITableViewprograma programáticamente, entonces es mejor agregarlo a la vista usando este[self.view insertSubview:self.tableView atIndex:0];


Esta debería ser la respuesta correcta. Si está agregando la subvista mediante programación, puede hacerlo en [self.view insertSubview:self.tableView atIndex:0];lugar de enviarla al fondo después de agregarla.
smitt04

Correcto. Pero sin saber cómo está iniciando su controlador (programáticamente, constructor de interfaces), no podemos asumir que es la mejor solución. Aunque he editado mi respuesta.
jbouaziz

Esto funciona pero parece un truco. ¿Hay algún aviso en la documentación oficial sobre esto?
John Tracid

4

Rápido 4 :

Establezca la siguiente línea de código en el método viewDidLoad:

self.navigationController?.navigationBar.isTranslucent = false

3

Puede agregar este método en su controlador de vista como se muestra en esta URL :

-(void)viewDidLayoutSubviews
{
    [super viewDidLayoutSubviews];
    self.searchBar.frame = 
    CGRectMake(0, self.topOfViewOffset, self.searchBar.frame.size.width, self.searchBar.frame.size.height);
}

2

Otro enfoque es configurarlo self.automaticallyAdjustsScrollViewInsets = YES;en su controlador de vista. Esto está habilitado por defecto. Pero en tu caso:

Veo que está utilizando EGORefreshHeaderView. Juega con contentInset de UITableView. Entonces, cuando lo suelte, el encabezado restablecerá el recuadro superior en lugar de restaurar el valor anterior.


-1

Si desea tener un control completo sobre las vistas y evitar ajustes defectuosos de iOS, subclase UITableView y ajuste las inserciones (tanto de desplazamiento como de indicadores) en - (void) willMoveToWindow: (UIWindow *) newWindow. Funciona para mi.


-4

Otra opción es abrir su archivo Info.plist en modo de código fuente e ingresar la siguiente información:

<key>UIViewControllerBasedStatusBarAppearance</key>
<false/>
<key>UIStatusBarHidden</key>
<true/>

Espero que esto ayude.


1
No creo que esto afecte la vista en absoluto.
Enrico Susatyo
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.