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

Después de actualizar a Xcode 5, las barras de navigation en todas las vistas de mi aplicación se han desplazado hacia abajo. Aquí hay algunas capturas de pantalla, la primera que muestra todo en la vista cuando se tira hacia abajo, y la segunda muestra todo sin tocar. La barra de búsqueda debe comenzar en la barra de navigation.

Todo el contenidoTodo el contenido en inactivo

Alguien sabe cómo puedo arreglar esto?

editar: he probado esta recomendación anterior:

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

Pero arroja resultados muy extraños.

Intento de solución

Esto puede deberse a que tengo un "menu deslizante" debajo de este controller de vista que aparece debido a la transparencia de la barra de navigation.

Establezca la propiedad translúcida de la barra de navigation en NO :

 self.navigationController.navigationBar.translucent = NO; 

Esto solucionará que la vista se enmarque debajo de la barra de navigation y la barra de estado.

Si tiene que mostrar y ocultar la barra de navigation, use

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

en su método viewDidLoad .

En iOS 7 por defecto, todo el valor de propiedad translúcido del Controlador es SÍ, por lo que se establece la propiedad translúcida NO para este problema.

 self.navController.navigationBar.translucent = NO; 

Puede desactivar el "Extender bordes" en el inspector de atributo de Controlador de vista de esta pantalla (como se muestra en la siguiente image):

introduzca la descripción de la imagen aquí

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

 navigationController?.navigationBar.translucent = false; 

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

 [self.view sendSubviewToBack:self.tableView] 

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

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

Puede agregar este método a su controller 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); } 

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

Veo que está utilizando EGORefreshHeaderView. Juega con contenidoInset de UITableView. Entonces, cuando lo suelte, el encabezado restablecerá la inserción superior en lugar de restaurar el valor anterior.

Swift 4 :

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

 self.navigationController?.navigationBar.isTranslucent = false 

Si desea tener control total sobre las vistas y evitar los ajustes defectuosos de iOS, subclass UITableView y ajuste los recuadros (tanto desplazamiento como indicadores) en – (void) willMoveToWindow: (UIWindow *) newWindow. Funciona para mi.

Otra opción es abrir su file 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.