La barra de navegación aparece sobre las vistas con el nuevo SDK de iOS7

113
CGRect cgRect1 = [[UIScreen mainScreen] applicationFrame];


UISearchBar  *mySearchBar = [[UISearchBar alloc] 
               initWithFrame:CGRectMake(0, 0, cgRect.size.width, 40)];

mySearchBar.autoresizingMask = 
              UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight ;


UITableView  *myTableView = [[UITableView alloc] 
     initWithFrame:CGRectMake(0, 40, cgRect.size.width, cgRect.size.height-40)];

myTableView.autoresizingMask = 
               UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight;


[self.view addSubview:mySearchBar];
[self.view addSubview:myTableView];

En las versiones anteriores funciona correctamente. La barra de búsqueda aparece debajo de la statusbarbarra de navegación y. El tableviewestá apareciendo por debajo de la barra de búsqueda

Pero cuando ejecuto esto Xcode 5 sdk iOS 7, la barra de búsqueda no es visible (creo que está ubicada debajo de la barra de estado y la barra de navegación), y también la barra de navegación aparece sobre la vista de tabla.

¿Se solucionará con iOS 7una versión estable?

¿O es el problema de mi codificación?

¿O deberíamos manejarlo agregando el (y = statubar height + nav bar height)valor de y para iOS 7?

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 por mí 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.

¿Alguien más ha tenido este problema?

ACTUALIZAR:

Encontré 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 evitará 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 en el que desea que la barra de navegación sea translúcida. Por ejemplo, al ver una foto en pantalla completa, deseo que la barra de navegación sea translúcida y que la vista quede enmarcada debajo. Eso funciona, pero cuando alterno mostrar / ocultar la barra de navegación, he experimentado resultados aún más extraños. La primera subvista (a UIScrollView) cambia sus límites y origen cada vez.


fuente
4
Software beta. Los foros de desarrolladores de Apple son más apropiados. Además, el problema se menciona explícitamente en la guía de transición.
Sulthan

Respuestas:

188

Eso no es del todo cierto. Se ha introducido una nueva propiedad en iOS 7 que le permite ajustar el comportamiento del diseño como en versiones anteriores de iOS. Coloque este fragmento de código en su controlador de vista, ¡y estará listo! El espacio que ocupa su barra de navegación debe contabilizarse automáticamente

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

Necesita agregar lo anterior en su -(void)viewDidLoadmétodo.

Nota: Debería utilizar la última versión de GM de iOS 7 y Xcode 5 ahora, ya que la API ha cambiado de las versiones beta.

Tripulación de un hombre
fuente
en Mi código dice edgeForExtendedLayout. Uso de identificador no declarado UIExtendedEdgeNone. Por favor ayuda.
6
Se cambió a UIRectEdgeNone
Simon
6
Esa es exactamente la razón por la que tal pregunta no debería formularse ni responderse aquí.
Sulthan
No entiendo por qué, si desea mantener la compatibilidad con ios6, se ve obligado a introducir un caso condicional por código para verificar si el controlador tiene esa propiedad o no ..
jerrygdm
12
Esto solo parece funcionar si la vista está incrustada en un UINavigationController.
pojo
37

Captura de pantalla del guión gráfico

Si está trabajando en Storyboard (que recomiendo encarecidamente), esta es la solución: puede desactivar "Extender bordes" de su ViewController en el storyboard. Tienes que hacer esto para cada viewController. Puede desactivar los bordes extendidos haciendo clic en el icono viewController en stortyboard (además del productOwner debajo de la vista) y luego seleccionando el inspector de atributos (como se muestra en las imágenes).

Esto también establecerá las líneas de alineación como iOS 6.

Otra gran herramienta en xCode 5 es "Vista previa": haga clic en el botón mayordomo (editor asistente) y seleccione Vista previa. allí puede seleccionar iOS 6 y ver cómo se verá el diseño de su guión gráfico en iOS 6.

Es simplemente genial: D

[Actualizar]

Tenga cuidado: deshabilitar "Extender bordes" puede resultar en un brillo negro en la barra de navegación cuando la aplicación ingresa en segundo plano en iOS7. el brillo también será visible en la vista multitarea (presione dos veces el botón de inicio). esto se puede solucionar estableciendo el color de fondo de la vista de la barra de navegación en blanco.

[self.navigationController.view setBackgroundColor:[UIColor whiteColor]];
MQoder
fuente
Sí, esta es la solución que viene desde una perspectiva de guión gráfico. Gracias.
jpittman
12

Como dice el OP, hay una solución simple para esto que es configurar la barra de navegación para que sea opaca. En lugar de hacer esto en el código, simplemente desmarque "Translúcido" para la barra de navegación raíz:

ingrese la descripción de la imagen aquí

Pujas
fuente
8

self.edgesForExtendedLayout=UIRectEdgeNone;

Funciona en el simulador de iOS 7 (Xcode 5 DP5)

yhlin
fuente
2
esto funciona bien en ios7, pero si ejecuté la aplicación en ios 6 y antes, las vistas se mueven hacia arriba. ¿Alguna solución para esto ?. También necesitamos establecer esta propiedad en cada controlador de vista viewdid método de carga?
loganathan
Siempre puede verificar si el iOS actual es 7 con esto si:if (NSFoundationVersionNumber > NSFoundationVersionNumber_iOS_6_1)
Aviel Gross
2

todas estas respuestas fueron útiles, especialmente las de MQoder, pero para mí también tuve que configurar la barra superior predeterminada en "navegación negra opaca".

ingrese la descripción de la imagen aquí

Jasonpurdy
fuente
1

La respuesta de @One Man Crew es correcta, pero:

Recomendaría usar este código para evitar errores al ejecutar la aplicación en versiones anteriores:

 #if __IPHONE_OS_VERSION_MAX_ALLOWED > __IPHONE_6_1
     if ([self respondsToSelector:@selector(edgesForExtendedLayout)])
        self.edgesForExtendedLayout = UIRectEdgeNone;
 #endif
Yossi
fuente
0

self.edgesForExtendedLayout = UIRectEdgeNone;

Y debe hacer esto en AppDelegate # aplicación: didFinishLaunchingWithOptions:

self.window.backgroundColor = [UIColor whiteColor];

De lo contrario, el color de fondo de la barra de navegación cambiará a gris. Porque la barra de navegación transparente se superpone a la ventana.

EIMEI
fuente
0

Si desea mantener la transparencia cuando el usuario se desplaza por la vista de la tabla, puede configurar el contentInset de la misma:

CGFloat topLayoutGuide = self.topLayoutGuide.length + self.tabBarController.navigationController.navigationBar.frame.size.height;
self.tableView.contentInset = UIEdgeInsetsMake(topLayoutGuide, 0, 0, 0);
Enrico Susatyo
fuente
-1

Una solución es utilizar el controlador de navegación. Esto resuelve automáticamente el problema. También use Xcode 5 en lugar de las versiones de Xcode Preview, ya que son beta.

Jayprakash Dubey
fuente