Última EDICIÓN

(En lugar de tener una excesivamente larga pregunta con ediciones de hacer una edición final de aclaración, por favor consulte otras ediciones si es necesario).

De Instalación Del Controlador De

Tengo una aplicación que se configura como sigue:

InitialViewController (subclase de ECSlidingViewController)

De Navegación principal Controlador (subclase de UINavigationController)

Principal de la Casa Vista Controlador (subclase de UIViewController)


En el viewDidLoad de la initialViewController me carga la barra de navegación principal de la controladora en la Casa de Controlador de Vista como su raíz.

self.topViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"MainNavVC"];

El Problema

En la primera carga de la aplicación en la barra de estado y la barra de navegación se separan.
UINavigationBar/Barra de Estado de la cuestión en IOS7

Este es el efecto deseado.

Sin embargo, luego de la carga modal de controlador de vista y cerca de ella, utilizando los métodos estándar:

[self performSegueWithIdentifier:@"LoadSelectOpponentVC" sender:self];

A continuación, cierre con:

[self dismissViewControllerAnimated:YES completion:nil];

Esto a su vez hace que la navegación principal (controlador de la celebración de la vista controlador) para mostrar la barra de estado de forma incorrecta y la superposición de:

UINavigationBar/Barra de Estado de la cuestión en IOS7

Pruebas

  1. Plist se establece para SÍ – View controller-based status bar appearance
  2. He tratado de establecer la edgesForExtendedLayout a la correspondiente a ninguno, pero ningún cambio.

Registro

He tratado de cerrar algunas tramas para ver donde se produce el problema:

En la primera Carga:

Principal Nav VC – cuadro de Vista – {{0, 0}, {320, 480}}

Main Nav VC - Nav Bar Frame - {{0, 0}, {320, 44}}

Initial VC - View Frame - {{0, 0}, {320, 480}}

Home VC - View Frame - {{0, 0}, {320, 480}} -- viewDidLoad Home VC

Home VC - View Frame - {{0, 64}, {320, 416}} -- viewWillAppear Home VC

--- After Modal is opened/closed ----

Home VC - View Frame - {{0, 64}, {320, 416}} -- viewWillAppear Home VC

Main Nav VC - View Frame - {{0, 0}, {320, 480}} -- viewWillAppear Main Nav

Main Nav VC - Nav Bar Frame - {{0, 20}, {320, 44}} -- viewWillAppear Main Nav

Home VC - View Frame - {{0, 44}, {320, 436}} -- viewDidAppear Home VC
  • «Se extiende por Debajo de la parte Superior Bares» sólo debería afectar a su vista la relación con la barra de Navegación.
  • Has probado a mover la barra de navegación del marco hacia abajo por la altura de la barra de estado?
  • Donde debería hacerse, aunque? Se pueden suministrar como una respuesta por favor?
  • Mismo problema en este caso…en busca de solución.
  • Encontraste alguna solución? El mismo problema para mí , cuando yo impresión navigationBar marco para el primer controlador que se imprime (x,y)->(0,20), a continuación, cuando presiono un controlador de vista que se imprime (x,y)->(0,0). ¿Cómo se convierta en 0?
  • ¿alguna vez encontrar una solución para esto?
  • No tuvimos que tomar un enfoque diferente debido a las limitaciones de tiempo. Salimos del MODO de pregunta abierta, como todas las respuestas son relevantes y soluciones para el problema. Gracias
  • Sí, la solución fue muy simple, involucrados en la manipulación de centerY – navBar.centerY += 20, cuando se desvanece la barra de estado, y eso es todo.

InformationsquelleAutor StuartM | 2013-09-22

14 Comentarios

  1. 39

    Trató de Apple recomendación sobre «Prevención de la Barra de Estado, Cubriendo Sus puntos de vista»: https://developer.apple.com/library/content/qa/qa1797/_index.html

    ¿Y usted echa un vistazo a «UIBarPositioningDelegate»: https://developer.apple.com/documentation/uikit/uibarpositioningdelegate

    • Esta referencia dice «las Aplicaciones que utilizan una opaco UINavigationController o UITabBarController automáticamente a mantener su contenido por debajo de la barra de estado.» pero esto claramente no es cierto por mi ejemplo/pregunta. También he probado a configurar la barra de posicionamiento como superior y topattached fue en vano.
    • He utilizado el método de cubiertos en la «Prevención de la Barra de Estado, Cubriendo Sus puntos de vista» que configura un espacio vertical de la restricción a la parte superior guía de diseño y la UINavigationBar que pongo en mi punto de vista se coloca debajo de la barra de estado. Tengo el mismo resultado por la fijación de la UINavigationBar con 20 píxeles de espacio vertical desde la parte superior de la vista.
    • asegúrese de configurar el diseño Automático correctamente para todo el viewcontroller. El apple doc dice reparar el primero. Yo sólo se aplica restricción entre la parte Superior de Guía de Diseño y de la vista superior y no de otra y no funcionó. Pero funcionó una vez que la Identificación de restricciones a la vista todo por debajo de viewcontroller.ver, al menos, y borra todo el diseño de advertencia en IB
    • UIBarPositioningDelegate FUNCIONA COMO UN ENCANTO! Acaba de hacer su controlador de vista de un UIBarPositioningDelegate y asígnele el bar del delegado. A continuación, agregue este método a la vista controlador (sólo disponible en iOS7+): – (UIBarPosition)positionForBar:(id<UIBarPositioning>)bar { return UIBarPositionTopAttached; }
    • ¿Cómo puedo assign it as the bar's delegate. ¿La barra de estado tiene un delegado? o ¿te refieres a los UINavigationBar?
    • Su punto de vista controlador debe ser el delegado de la barra que está tratando de posición con «positionForBar:» no, la barra de estado.

  2. 26

    En iOS 7.0 UIViewController funciona por defecto de esta manera. La vista de pantalla completa si usted está usando UIViewController dentro de UINavigationController y la navigationBar es visible.

    Si navigationBar es visible que haga lo siguiente.
    ==>

    self.edgesForExtendedLayout = UIRectEdgeNone
    

    si navigationBar se oculta hacer lo siguiente .
    ==>

    Ajustar todos los UIView elementos de cambio de 20 puntos

    Si utiliza el Interface builder, usted puede utilizar iOS6/7 deltas: en Primer lugar, «ver como iOS 6.0», a continuación, establecer un delta de «20» para alcanzar los +20 offset en iOS 7

    • El edgesForExtendedLayout afecta a cómo el controlador de vista es la pantalla con la barra de estado, si el contenido va a ir por debajo etc. He puesto en mi pregunta que yo ya había probado este también.
    • como iOS 6.0″, a continuación, establecer un delta de «20» para alcanzar los +20 offset en iOS 7″ Puede usted explicar esto ?
    • Seguro. Básicamente, usted tiene que fijar la vista como iOS 6.0 en lugar de 7.0. Se puede ver en «Generador de Interfaz de Documento» elemento de Interface Builder.
  3. 18

    Me sorprende que nadie ha dado en el derecho de respuesta todavía. UIBarPositioningDelegate funciona como un encanto! Acaba de hacer su controlador de vista de un UIBarPositioningDelegate y asígnele el bar del delegado. La posición de la barra de 20 píxeles de la parte superior de la vista. A continuación, agregue este método a la vista controlador (sólo disponible en iOS7+):

    - (UIBarPosition)positionForBar:(id<UIBarPositioning>)bar 
    { 
       return UIBarPositionTopAttached; 
    }
    
    • No tuvimos que tomar un enfoque diferente debido a las limitaciones de tiempo. Salimos del MODO de pregunta abierta, como todas las respuestas son relevantes y soluciones para el problema. Gracias
    • ¿Puede explicar esto? AFAIK no se puede establecer el delegado de la barra de navegación cuando es gestionado por un controlador de navegación.
    • Esta solución funciona cuando la adición de una barra de navegación personalizada a un UIViewController. Para un UINavigationController, usted tendrá que crear una subclase de UINavigationController y definir que la subclase como un UINavigationBarDelegate (que se ajusta a UIBarPositioningDelegate), similar a este: stackoverflow.com/a/7453933/485895. Sólo añadir la positionForBar: método mencionado en mi respuesta es todo lo que usted necesita hacer para resolver el problema en cuestión, pero se puede ver que esta subclase enfoque ofrece otras oportunidades.
  4. 4

    Tuve un problema similar con una «hamburguesa» botón de menú que se desliza el principal controlador de vista de encima y había un menú vista controlador en el lado. He encontrado que la vista del menú del controlador de la barra de navegación no era consciente de si la barra de estado se muestran o no. Me fijo por la publicación de una notificación cuando la barra de estado se muestra y hiddden, a continuación, haciendo

    [self.navigationController setNavigationBarHidden:YES/NO animated:NO];
    

    en el menú del controlador de vista.

  5. 3

    He arreglado un problema con la respuesta de este post: iOS 7 | barra de Navegación /botones de Barra de herramientas muy cerca de la barra de estado

    El uso de Autodiseño debe ignorar la configuración de un nuevo Marco. Usted debe agregar un Espacio de Restricción igual a 20 para el TopBar para iOS 7.

    • He probado la solución a esta pregunta, pero no tuvo suerte. Puede usted proporcionar un código de ejemplo de cómo se establece el diseño Automático, o lo hizo competir en IB?
    • 1. Agregar salida para la parte Superior de la Barra de Espacio Restricción (Espacio Vertical – Barra de Navegación – View) en el código. 2. Conjunto delegado de la barra de herramientas para el acuerdo de VC. 3. Agregar de delegado método como se especifica en la url anterior. 4. Agregar esta en viewWillAppear > si (IS_IOS_7) auto.navBarTopSpaceConstraint.constante = 20;
    • ¿has conseguido solucionarlo?
    • Todavía no he sido capaz de probar esto, voy a dar la vuelta a esta pronto y actualización
    • ¿Por qué le están pidiendo a la gente a ayudar a usted si usted no es capaz de poner a prueba(apreciar) alguien ayuda?
    • He tenido que utilizar un enfoque diferente de como yo era incapaz de obtener esta resuelto, voy a volver a abrir el proyecto en el día de hoy y tratar de conseguir que esto funcione. Yo beleive el problema está en como la tercera parte de la diapositiva del menú obras como esta se informó también a ellos y fueron incapaces de resolver. Pero la pregunta no proporciona una vasta variedad de información para otras personas con este problema para ayudar a tratar y resolver para ellos.

  6. 3

    Hizo intenta agregar el siguiente código a su viewDidLoad método :

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

    Es rápidamente explicó en Apple migrar a iOS 7 doumentation.

    • No incluir las firmas en sus puestos de trabajo.
    • Sí, he tratado de agregar esto a mi punto de vista controlador viewDidLoad y mi Navegación Controlador de la subclase viewDidLoad, pero el cambio no
    • Verificación de la pregunta final de edición, por favor
    • no es trabajo para mí
    • No trabajo para mí
  7. 1

    He respondido a este problema en la longitud en esta respuesta a una pregunta similar. La respuesta corta es esta: no hay manera de obtener la automática del diseño de la barra de comportamiento que usted está acostumbrado en iOS 6 y versiones anteriores. Tendrás que diseñar a su alrededor, o encontrar una manera de simular el viejo estilo (me cubra ambos enfoques).

    Te aconsejo que no hacer ajustes manuales a la barra de navegación marco. Vamos a UINavigationController manejar por ti mismo. Es más probable que su problema es que su navegación del controlador de vista del marco no es igual a la UIScreen límites.

    • Gracias, he actualizado a la pregunta con una nueva EDICIÓN. Lo que me estoy encontrando es el marco de los cambios de la barra de navegación. Inicialmente se carga como 0,20 desplazamiento y, a continuación, más tarde, los cambios de 0,0. Cuando la comprobación de nuevas aplicaciones en la app store que tiene el diseño de 0,20 a través de fuera. No hay una manera fácil de lograr esto. Idealmente, yo no quiero tener que animar la navbar/otros puntos de vista abajo, cada vez que está fuera de línea
    • Está usted ocultando la barra de estado mientras su vista modal es visible?
    • ¿Cuál es el marco inicial de su UINavigationController la vista (no de la barra de navegación) en la PUNTA?
    • Está usted usando UINavgationBar directamente, ya sea en el código o en su PUNTA? Si es así, ¿por qué?
    • La navegación de los controladores de cuadro de vista sigue siendo el mismo a través de fuera. nav cuadro de vista: {{0, 0}, {320, 480}}. No estoy usando la barra de navegación directamente se utiliza desde un controlador de navegación
    • No creo que tu respuesta es la solución aquí. Aparece mi barra de navegación marco se va a cambiar de alguna manera, pero no puedo saber cómo y por qué. Su respuesta dice que usted no puede conseguir el mismo efecto como iOS6. Lo que estoy tratando de lograr es la barra de estado como un elemento para que la barra de navegación aparece 20 hacia abajo desde la parte superior y como un elemento juntos. Como la mayoría de las aplicaciones veo en la app store que han hecho de sí ios7 compat.
    • permítanos continuar esta discusión en el chat
    • Cualquier pensamiento, continuación de la anterior. Me han comentado que con la pertinente información sobre el marco. Su respuesta dice que usted no puede conseguir el mismo efecto como iOS6. Lo que estoy tratando de lograr es la barra de estado como un elemento para que la barra de navegación aparece 20 hacia abajo desde la parte superior y como un elemento juntos. Como la mayoría de las aplicaciones veo en la app store que han hecho de sí ios7 compat
    • No es cierto. Hay una manera. Véase mi respuesta a continuación. Usted puede mantener este comportamiento de la barra con un UIBarPositioningDelegate.

  8. 1

    Yo sé que usted ha ViewController como Principal VC. Pero si alguien está utilizando un UITableviewController y teniendo el mismo problema, este código se soluciona el problema:

    self.tableView.contentInset = UIEdgeInsetsMake(20.0f, 0.0f, 0.0f, 0.0f);
    
  9. 0

    La solución a esto es realmente muy simple. Que implica la manipulación de UINavigationBar del center.y valor, que es lo que UIKit utiliza de forma nativa con el fin de ajustar UINavigationBar a la barra de estado de la altura. Para simplificar, me subclases UINavigationBar y tuvieron los siguientes:

    @implementation MyNavigationBar
    
        - (void) setCenter:(CGPoint)center {
            //Anything less than or equal to 22 is something we don't want (below SB height)
            if(center.y > 22) [super setCenter:center];
        }
    
    @end
    
  10. 0

    Sí tenía el mismo problema. seguido todos los paso pero no cambiar.

    Tengo que trabajar por asegurarse de que el diseño Automático configurado correctamente para la totalidad de la pantalla no sólo la parte superior ver/barra de herramientas como se especifica en

    «La prevención de la Barra de Estado, Cubriendo Sus puntos de vista» : https://developer.apple.com/library/ios/qa/qa1797/_index.html

    Al menos para todos los puntos de vista justo debajo de la principal Viewcontroller.ver.

  11. 0

    Hay un built-en la manera de hacer esto.
    Mismo como Joel de la Cueva de la respuesta, pero elaborado:

    Hacer su barra de navegación tiene un origen Y de 20 puntos.

    A continuación, en la .h archivo:

    @interface XYZViewController : UIViewController <UIBarPositioningDelegate>
    

    Y en el .m de archivo:

    - (void)viewDidLoad {
        [super viewDidLoad];
        self.navigationBar.delegate = self;
    }
    
    - (UIBarPosition)positionForBar:(id<UIBarPositioning>)bar { 
        return UIBarPositionTopAttached; 
    }
    
    • Mi punto de vista de los controladores no tienen una propiedad llamada navigationBar.
    • Puede acceder a ella con esto, pero no soluciona el problema de auto.navigationController.navigationBar.delegado = auto; Si el éxito de resolver el problema con esto, dime plz. Se me vuelve loco ><
    • En primer lugar, el tipo de delegado para el encabezado es <UINavigationBarDelegate>, en segundo lugar, esto no resuelve el problema.
  12. -1

    Estoy un poco demasiado tarde a la fiesta, pero desde que se enfrentó al mismo problema y este fue el primer resultado que se mostró en la búsqueda, supongo que mi respuesta podría ayudar a otras personas 🙂

    Me ha solucionado el problema mediante la implementación de

    - (BOOL)shouldAutorotate
    {
        return NO;
    }
    

    en el controlador de vista que presenta el modal.

  13. -1

    Probarlo, todos navigationBars debe ser translúcido es deshabilitar.

    [self.navigationController.navigationBar setTranslucent:NO];
    

    Si usted ha diseñado su punto de vista con un guión gráfico a continuación, puede resolver el problema utilizando XCode. Seleccione el NavigationBar widget y desmarque la opción «Translúcido».

    UINavigationBar/Barra de Estado de la cuestión en IOS7

Dejar respuesta

Please enter your comment!
Please enter your name here