¿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.

Sam D20
fuente
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.

Deepesh
fuente
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;
Sumit Mundra
fuente
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í

Achyut Sagar
fuente
12

Esto también funciona para Swift en iOS 8.1

navigationController?.navigationBar.translucent = false
uplearnedu.com
fuente
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];

jbouaziz
fuente
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
Md. Najmul Hasan
fuente
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);
}
Malkoty
fuente
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.

Krivoblotsky
fuente
-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.

Farhad Malekpour
fuente
-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.

Nicoli
fuente
1
No creo que esto afecte la vista en absoluto.
Enrico Susatyo