Recientemente descargué Xcode 5 DP para probar mis aplicaciones en iOS 7. Lo primero que noté y confirmé es que los límites de mi vista no siempre cambian de tamaño para tener en cuenta la barra de estado y la barra de navegación.
En viewDidLayoutSubviews
, imprimo los límites de la vista:
{{0, 0}, {320, 568}}
Esto hace que mi contenido aparezca debajo de la barra de navegación y la barra de estado.
Sé que podría explicar la altura yo mismo obteniendo la altura de la pantalla principal, restando la altura de la barra de estado y la altura de la barra de navegación, pero eso parece un trabajo adicional innecesario.
¿Cómo puedo solucionar este problema?
Actualizar:
He encontrado una solución para este problema específico. Establezca la propiedad translúcida de la barra de navegación en NO:
self.navigationController.navigationBar.translucent = NO;
Esto solucionará que la vista se enmarque debajo de la barra de navegación y la barra de estado.
Sin embargo, no he encontrado una solución para el caso cuando desea que la barra de navegación sea translúcida. Por ejemplo, al ver una foto a pantalla completa, deseo que la barra de navegación sea translúcida y que la vista se enmarque debajo de ella. Eso funciona, pero cuando alterno mostrar / ocultar la barra de navegación, he experimentado resultados aún más extraños. La primera subvista (un UIScrollView) tiene sus límites y el origen cambia cada vez.
Respuestas:
Puede lograr esto implementando una nueva propiedad llamada
edgesForExtendedLayout
en iOS7 SDK. Agregue el siguiente código para lograr esto,Necesita agregar lo anterior en su
-(void)viewDidLoad
método.Consulte, documento de apple
fuente
No tiene que calcular qué tan lejos puede desplazar todo hacia abajo, hay una propiedad incorporada para esto. En Interface Builder, resalte su controlador de vista y luego navegue al inspector de atributos. Aquí verá algunas casillas de verificación junto a las palabras "Extender bordes". Como puede ver, en la primera captura de pantalla, la selección predeterminada es que el contenido aparezca debajo de las barras superior e inferior, pero no debajo de las barras opacas, por lo que configurar el estilo de barra para que no sea translúcido funcionó para usted.
Como puede ver en la primera captura de pantalla, hay dos elementos de la interfaz de usuario ocultos debajo de la barra de navegación. (He habilitado wireframes en IB para ilustrar esto) Estos elementos, un UIButton y un UISegmentedControl tienen su origen "y" establecido en cero, y el controlador de vista está configurado para permitir contenido debajo de la barra superior.
Esta segunda captura de pantalla muestra lo que sucede cuando desmarca la casilla de verificación "Bajo las barras superiores". Como puede ver, la vista de los controladores de vista se ha desplazado hacia abajo de manera apropiada para que su origen esté justo debajo de la barra de navegación.
Esto también se puede lograr mediante programación mediante el uso de
-[UIViewController edgesForExtendedLayout]
. Aquí hay un enlace a la referencia de clase para edgeForExtendedLayout y para UIRectEdgefuente
Creé mi vista mediante programación y esto terminó funcionando para mí:
Fuente (en la sección topLayoutGuide en la parte inferior de la página 39).
fuente
topLayoutGuide
es solo iOS7.Solución Swift 3 / Swift 4 que también funciona con archivos NIB / XIB en iOS 10+:
fuente
Si desea que la vista tenga la barra de navegación translúcida (que es bastante agradable), debe configurar un ContentInset o similar.
Así es como lo hago:
fuente
contentInset
es propiedad deUIScrollView
. ¿Qué pasa si mi vista principal no es una subclase deUIScrollView
. Entonces, ¿cómo solucionaría el problema de superposición?edgesForExtendedLayout
hace el truco para iOS 7. Sin embargo, si compila la aplicación en iOS 7 SDK y la implementa en iOS 6, la barra de navegación parece translúcida y las vistas van debajo de ella. Entonces, para solucionarlo tanto para iOS 7 como para iOS 6, haga esto:fuente
En su archivo de aplicaciones, agregue una fila, llámelo "Ver la apariencia de la barra de estado basada en el controlador" y configúrelo en NO .
fuente
El truco más simple es abrir el archivo NIB y realizar estos dos simples pasos:
Y el resultado :
fuente
Solución rápida:
fuente
super.viewWillAppear(animated)
Me gustaría ampliar la respuesta de Stunner y agregar una
if
declaración para verificar si es iOS-7, porque cuando lo probé en iOS 6 mi aplicación se bloqueó.La adición sería agregar:
Por lo tanto, sugeriría agregar este método a su
MyViewControler.m
archivo:fuente
Swift 3
fuente
Tengo un escenario en el que uso el BannerViewController escrito por Apple para mostrar mis anuncios y un ScrollViewController incrustado en el BannerViewController.
Para evitar que la barra de navegación oculte mi contenido, tuve que hacer dos cambios.
1) Modificar BannerViewController.m
2) Modificar mi ScrollViewContoller
Ahora los anuncios se muestran correctamente en la parte inferior de la vista en lugar de estar cubiertos por la barra de navegación y el contenido en la parte superior no se corta.
fuente
simplemente configure el siguiente código a la vista aparecerá.
fuente
hacer restricciones al diseño superior como este
fuente
Swift 4.2 - Xcode 10.0 - iOS 12.0:
fuente
Para mí, la solución más simple es agregar dos claves al plist
fuente
Agregue la clave "Ver la apariencia de la barra de estado basada en el controlador" de la lista desplegable como una fila
info.plist
. Algo como esto:fuente
Tuve el mismo problema con mi aplicación de iPads (armv7, armv7s, amr64) solo al presentar otro UIViewController y después de descartarlos, aparece la barra de navegación debajo de la barra de estado ... Dedico mucho tiempo a encontrar una solución para eso. Estoy usando el guión gráfico y en InterfaceBuilder para UIViewController, lo que hace que sea terrible configuré Presentación desde Pantalla completa -> Contexto actual y solucionó este problema. ¡Funciona en mi aplicación solo para iPads => iOS8.0 (prueba con iOS8.1) y para iPads con iOS 7.1 no funciona!
fuente
Pasos para ocultar la barra de estado en iOS 7:
1.Vaya al archivo info.plist de su aplicación.
2.Y establecer, ver la apariencia de la barra de estado basada en el controlador: booleano NO
Espero haber resuelto el problema de la barra de estado .....
fuente
En mi caso, tener loadView () interrumpió
este código: self.edgesForExtendedLayout = UIRectEdgeNone
pero después de eliminar loadView () todo funcionó bien
fuente