ios objective-c ios7 uinavigationbar uistatusbar

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



objective-c ios7 (10)

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 en la vista a medida que se baja, y la segunda muestra todo intacto. La barra de búsqueda debería comenzar donde está la barra de navegación.

¿Alguien sabe cómo puedo solucionar esto?

editar: he probado esta recomendación anterior:

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

Pero produce resultados muy extraños.

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


En iOS 7 por defecto, todo 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;


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

self.navigationController.navigationBar.translucent = NO;

Esto arreglará la vista al enmarcarse 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 método viewDidLoad .


Esto funciona para rápido también en iOS 8.1

navigationController?.navigationBar.translucent = false;


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

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

Espero que esto ayude.


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

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


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); }


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


Si desea mantener la translucidez en su navigationBar , al final de su viewDidLoad o en su viewWillAppear agregue esta línea de código:

[self.view sendSubviewToBack:self.tableView]

De alguna manera, si su subclase scrollView ( UITableView , UICollectionView , etc.) está en el index 0 en las subviews su vista actual, ajustará automáticamente las inserciones de acuerdo con su subviews navigationBar . Y tampoco debería afectar su interfaz de usuario en versiones anteriores a iOS7.


EDITAR Si inicializa su UITableView programación, entonces es mejor agregarlo a la vista usando [self.view insertSubview:self.tableView atIndex:0];


Si desea tener un control total de las vistas y evitar ajustes defectuosos de iOS, la subclase UITableView y ajustar las inserciones (tanto desplazamiento como indicadores) en - (vacío) willMoveToWindow: (UIWindow *) newWindow. Funciona para mi.


Swift 4 :

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

self.navigationController?.navigationBar.isTranslucent = false