13

Estoy tratando de mostrar un UILabel encima de un UINavigationController. El problema es que cuando agrego UILabel como una subvista de UIWindow, no gira automáticamente ya que no es una subvista de UIViewController (UIViewController maneja automáticamente las subvistas de actualización durante las rotaciones).Agregando un UINavigationController como una subvista de UIView

Esta es la jerarquía que estaba usando:

  • UIWindow
    • UILabel
    • UINavigationController

Así que estaba pensando que podría utilizar la siguiente jerarquía:

  • UIWindow
    • UIViewController
      • UIView
        • UILabel
        • UINavigationController

De esta forma, la etiqueta podría mostrarse en la parte superior de la barra de UINavigationController mientras se gira automáticamente ya que es una subvista de UIViewController.

El problema es que cuando intento añadir un UINavigationController como subvista de un punto de vista:

[myViewController.view addSubview:myNavigationController.view]; 

que aparecerá 20 píxeles hacia abajo. Lo que supongo es porque cree que necesita hacer espacio para la barra de estado. Pero, dado que el UINavigationController se coloca dentro de una UIView que no se superpone en la parte superior de la barra de estado, agrega incorrectamente 20 píxeles adicionales. En otras palabras, la parte superior de UINavigationBar está en la marca de 40 píxeles de la pantalla en lugar de en 20 píxeles.

¿Hay alguna manera fácil de cambiar el UINavigationController y todos sus elementos (por ejemplo, barra de navegación, barra de herramientas, controlador de vista raíz) hasta 20 píxeles? ¿O para hacerle saber que no debería compensar una barra de estado?

Si no, supongo que necesitaría usar mi primera jerarquía mencionada anteriormente y descubrir cómo rotar la etiqueta para que sea coherente con la rotación de la barra de navegación. ¿Dónde puedo encontrar más información sobre cómo hacer esto?

Nota: al "mostrar una etiqueta en la parte superior de la barra de navegación", quiero decir que debe superponerse en la parte superior de la barra de navegación ... simplemente no puede envolverse en un elemento de botón de barra y colocarse como uno de los elementos de la barra de navegación.

Respuesta

18

Utilizando este código parece funcionar:

nav.view.frame = CGRectMake(nav.view.frame.origin.x, nav.view.frame.origin.y - 20, 
          nav.view.frame.size.width, nav.view.frame.size.height); 

lo hice antes de agregar el controlador de navegación como una vista secundaria. El uso de [UIApplication sharedApplication] .statusBarFrame en lugar del código fijo 20 también sería una buena idea.

No estoy seguro de si es la mejor manera de hacerlo.

+5

uso nav.view.frame = CGRectMake (0,0, self.view.frame.size.width, auto .view.frame.size.height); \t para hacer que esto también funcione en ipad, que no tiene el error +20 pero tiene otros problemas con el ancho y alto, en general es un depósito total, muy descuidado de apple – valexa

+2

Tengo una instancia donde si cargo un UINavigationController ver como una subvista en modo horizontal en el iPad Obtengo el error de 20 píxeles. Pero solo la primera vez. Puedo volver a agregar la supervisión más tarde y el problema desaparecerá. Muy, muy frustrante. –

+0

Parece que tengo el mismo problema. Nada realmente me dice que la barra de navegación tiene un desplazamiento de 20 píxeles verticalmente. @DanielWood Realmente comparto tu frustración. Si presiono y luego selecciono otro controlador, todo está bien, pero la primera vez ... Intento jugar. – Vaseltior

2

Si desea un marco que represente el área de contenido disponible, simplemente debe usar: [[UIScreen mainScreen] applicationFrame]. Por supuesto, esto restringe su controlador de vista de nivel superior para que solo pueda ser de nivel superior. Así que todavía es un poco dudoso, pero no tanto.

2

¿Por qué no usa el Marco de aplicación en lugar de agregar algunos valores a los orígenes? Me refiero usando:

CGRect appFrame = [[UIScreen mainScreen] applicationFrame]; 

como marco de referencia, y hacer algo como esto:

nav.view.frame = CGRectMake(appFrame.origin.x, appFrame.origin.y, ... 

Éste trabajó para mí.

0

Tuve este mismo problema pero logré solucionarlo.

Me di cuenta de que la vista de mi controlador de vista tenía el fotograma correcto, pero la barra de navegación del controlador de vista no (tenía un origen de fotograma de (0,20)).

Inserte esto en el controlador de la opinión de que es la supervista del controlador de navegación:

- (void) viewDidAppear:(BOOL)animated { 
    if (navigationController.navigationBar.frame.origin.y != 0) { 
     [[navigationController view] removeFromSuperview]; 
     [[self view] addSubview:navigationController.view]; 
    } 
} 
Cuestiones relacionadas