Recientemente he descargado Xcode 5 DP para probar mis aplicaciones en iOS 7. La primera cosa que me di cuenta y confirmado es que mi punto de vista los límites no siempre cambia de tamaño para dar cuenta de la barra de estado y la barra de navegación.

En viewDidLayoutSubviews, puedo imprimir la vista de los límites:

{{0, 0}, {320, 568}}

Este resultado en mi contenido que aparece debajo de la barra de navegación y la barra de estado.

Sé que podría dar cuenta de la altura a mí mismo por llegar a la pantalla principal de la altura, restando el estado de la altura de la barra y la barra de navegación de altura, pero que parece innecesario de trabajo extra.

¿Cómo puedo solucionar este problema?

Actualización:

He encontrado una solución para este problema específico. Conjunto de la barra de navegación traslúcido de propiedad NO:

self.navigationController.navigationBar.translucent = NO;

Esto solucione el punto de vista de ser enmarcado debajo de la barra de navegación y la barra de estado.

Sin embargo, no he encontrado una solución para el caso cuando se desea que la barra de navegación para ser translúcido. Por ejemplo, la visualización de una foto a pantalla completa, me gustaría que la barra de navegación transparente, y la vista para ser enmarcado por debajo de ella. Que funciona, pero cuando me alternar mostrar/ocultar la barra de navegación, he experimentado aún más extraño resultados. La primera subvista (un UIScrollView) obtiene sus límites origen y cambia cada vez.

  • También estoy recibiendo el mismo problema en xcode 5 DP
  • Déjeme saber si usted va a obtener alguna solución
  • Genial..Es trabajo para mí también..
  • Podría usted decirme por qué de la barra de navegación botón atrás mostrando siempre con el texto en azul???
  • Buscar en la barra de navegación de un matiz de color de la propiedad, usted debería ser capaz de cambiar ese color azul a lo que usted desea.
  • Odio la actualización de ios a veces porque Apple nunca le dio una oportunidad para mantener su aplicación compatible.
  • Muchas gracias por esta. Funciona a la perfección!
  • ponga su actualización como una respuesta y aceptar que como la respuesta a ayudar a los demás
  • Si el problema está relacionado con la visión de ir debajo de la barra de estado después de ocultar el controlador de navegación barra de arriba me remito a la respuesta de @Maravilla stackoverflow.com/a/18976660/235206 como la solución
  • Gracias por esto, ojalá hubiera encontrado 8 horas… por lo que vale, una instalación Nueva de mi Aplicación no tiene este problema, pero en la actualización de mi aplicación no.. extraño ios7 $#!+
  • Me pregunto por qué…
  • no, cuando se presentan modalviewcontrollers

InformationsquelleAutor beebcon | 2013-06-12

20 Comentarios

  1. 494

    Usted puede lograr esto mediante la implementación de una nueva propiedad llamada edgesForExtendedLayout en iOS7 SDK. Por favor, agregue el siguiente código para lograr esto,

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

    Usted necesita agregar el sobre en su -(void)viewDidLoad método.

    de iOS 7 trae varios cambios en la forma de organizar y personalizar el
    la apariencia de su interfaz de usuario. Los cambios en el controlador de vista de diseño, el matiz
    el color, la fuente y afectan a todos los UIKit objetos en la aplicación. En
    además, las mejoras gesto de reconocimiento de la Api de darle más fino
    un control preciso sobre el gesto de las interacciones.

    El Uso De La Vista De Los Controladores De

    En iOS 7, vista uso de controladores de pantalla completa disposición. Al mismo tiempo,
    iOS 7 le da un control más granular sobre la forma en que un controlador de vista
    expone sus puntos de vista. En particular, el concepto de diseño de la pantalla
    ha sido refinado para permitir que un controlador de vista de especificar el diseño de cada uno de los
    el borde de su vista.

    La wantsFullScreenLayout controlador de vista de la propiedad está en desuso en
    iOS 7. Si actualmente especificar wantsFullScreenLayout = NO, la vista
    el controlador puede mostrar su contenido en una pantalla inesperado ubicación
    cuando se ejecuta en iOS 7.

    Para ajustar la forma de un controlador de vista expone sus puntos de vista, UIViewController
    proporciona las siguientes propiedades:

    • edgesForExtendedLayout

    La edgesForExtendedLayout propiedad utiliza la UIRectEdge tipo,
    que se especifica cada uno de un rectángulo de cuatro bordes, además de
    especificar ninguno y todos. Uso edgesForExtendedLayout para especificar que
    los bordes de un punto de vista debe ser extendido, independientemente de la barra de translucidez. Por
    por defecto, el valor de esta propiedad es UIRectEdgeAll.

    • extendedLayoutIncludesOpaqueBars

    Si su diseño se utiliza opaco bares, refinar edgesForExtendedLayout por
    también la configuración de la extendedLayoutIncludesOpaqueBars propiedad
    NO. (El valor predeterminado de extendedLayoutIncludesOpaqueBars es NO.)

    • automaticallyAdjustsScrollViewInsets

    Si usted no desea un desplazamiento de la vista del contenido de los márgenes de ser automáticamente
    ajustado, establecer automaticallyAdjustsScrollViewInsets a NO. (El
    valor predeterminado de automaticallyAdjustsScrollViewInsets es .)

    • topLayoutGuide, bottomLayoutGuide

    La topLayoutGuide y bottomLayoutGuide propiedades indican la
    ubicación de la parte superior o inferior de la barra de bordes en un controlador de vista de la vista.
    Si las barras se deben solapar la parte superior o inferior de una vista, puede utilizar
    Interface Builder para la posición de la vista en relación a la barra mediante la creación de
    limitaciones a la parte inferior de topLayoutGuide o a la parte superior de
    bottomLayoutGuide. (Si no hay bares debe superponerse con la vista, la parte inferior de
    topLayoutGuide es la misma que la parte superior de la vista y la parte superior de
    bottomLayoutGuide es la misma que la parte inferior de la vista.) Ambos
    las propiedades son perezosamente creado cuando se le solicite.

    Consulte, apple doc

    • No se compila en iOS6. Creo que debe ser escrito como performselector…
    • Sí, es por Eso que he incluido el selector de verificación con la condición del if si ([auto respondsToSelector:@selector(edgesForExtendedLayout)])
    • He intentado… Pero el uso de este método cambia todos mis barras de color blanco a gris… ¿hay una solución?
    • establecer su color de la ventana a la vista el color de fondo, es decir: [auto.ventana setBackgroundColor:[UIColor whiteColor]];
    • Esto no funcionaría si no tengo la barra de navegación. En ese caso, mi opinión es que se extiende detrás de la barra de estado..
    • Tengo el mismo problema que @VanDuTran. edgesForExtendedLayout no ayuda si la barra de navegación está oculto.
    • También, este texto se copia de la documentación de Apple, que está muy lejos de ser clara. Puede alguien explicar en palabras comprensibles lo que todas estas opciones?
    • Si el problema está relacionado con la visión de ir debajo de la barra de estado después de ocultar el controlador de navegación barra de arriba me remito a la respuesta de @Maravilla stackoverflow.com/a/18976660/235206 como la solución
    • Hice todo lo sugerido: ningún cambio. La barra de estado se muestra siempre translúcido y también emergente de vistas muestra después de la barra de estado
    • Tuve un problema tratando de usar esta solución. Se resuelve por asegurarse de que estaba en un Xcode 5.0 guión y había Vista como conjunto para iOS 7.0 y posteriores en el inspector de archivo para el guión gráfico. Si lo tienes configurado para una versión anterior de Xcode, usted no conseguirá el nuevo diseño de la funcionalidad.
    • funciona, pero … ya no hay efecto translúcido… ¿cómo podemos preservar efecto translúcido así…
    • la adición de este fragmento de código en -(void)viewDidLayoutSubviews{ hizo el truco para mí
    • no funciona cuando la presentación de modal de vista de los controladores
    • Gran respuesta! Por cierto, el código swift es if(self.respondsToSelector(Selector("edgesForExtendedLayout"))) { self.edgesForExtendedLayout = UIRectEdge.None }
    • ¿qué pasa en iOS 8?

  2. 110

    Usted no tiene que calcular a qué distancia se cambio todo, hay una construcción en propiedad de esta. En el Interface Builder, resalte el controlador de vista y, a continuación, vaya a los atributos del inspector. Aquí podrás ver algunas casillas de verificación junto a las palabras «Extender los Bordes». Como se puede ver, en la primera captura de pantalla, la selección por defecto es de contenido para aparecer en la parte superior e inferior de las barras, pero no bajo la opaca bares, que es la razón por la configuración de la barra de estilo para no translúcido trabajado para usted.

    Como puede ver algo en la primera captura de pantalla, hay dos elementos de interfaz de usuario escondido debajo de la barra de navegación. (Me he permitido tramas en IB para ilustrar este) Estos elementos, un UIButton y un UISegmentedControl ambos tienen sus «y» origen se ajusta a cero, y la vista controlador está configurado para permitir que el contenido debajo de la parte superior de la barra.

    Barra de estado y la barra de navegación aparecer en mi opinión límites en iOS 7

    Esta segunda captura de pantalla muestra lo que sucede cuando usted anule la selección de la «Virtud de la parte Superior de las Barras de» casilla de verificación. Como se puede ver, el punto de vista de los controladores de vista ha desplazado hacia abajo de manera apropiada para su origen y a la derecha debajo de la barra de navegación.

    Barra de estado y la barra de navegación aparecer en mi opinión límites en iOS 7

    Esto también se puede lograr mediante programación a través del uso de -[UIViewController edgesForExtendedLayout]. Aquí hay un enlace a la referencia de la clase para edgeForExtendedLayout, y para UIRectEdge

    [self setEdgesForExtendedLayout:UIRectEdgeNone];
    • ¿Cómo puedo hacer lo mismo para ver sólo en una .xib?
    • He añadido una etiqueta a la vista y he seguido tus instrucciones pero este no es trabajo para mí
    • La respuesta a la XIB pregunta es, «no Se puede.» No a través de IB de todos modos. Archivo de un radar y la esperanza de Apple finalmente se dirige.
    • Gracias @0x7fffffff, Esta era la información que yo estaba buscando, y fue muy útil.
  3. 33

    He creado mi punto de vista mediante programación y este terminó trabajando para mí:

    - (void) viewDidLayoutSubviews {
        //only works for iOS 7+
        if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0) {
            CGRect viewBounds = self.view.bounds;
            CGFloat topBarOffset = self.topLayoutGuide.length;
    
            //snaps the view under the status bar (iOS 6 style)
            viewBounds.origin.y = topBarOffset * -1;
    
            //shrink the bounds of your view to compensate for the offset
            viewBounds.size.height = viewBounds.size.height + (topBarOffset * -1);
            self.view.bounds = viewBounds;
        }
    }

    Fuente (en topLayoutGuide sección en la parte inferior de la página.39).

    • Finalmente encontré una respuesta que en realidad trabaja para ello. Buen trabajo!
    • Para resolver el problema por el cual el controlador de vista de la vista se muestra en la barra de estado cuando la barra de navegación está oculta, este es el código que se ajusta a la vista en la barra de estado.
    • Nota: empuje la parte inferior de la vista fuera de la pantalla.
    • También, a menos que usted está construyendo para solo iOS7, el código anterior generará un error – topLayoutGuide es iOS7 sólo.
    • Gracias, acabas de salvarme de 2 horas de la llanura código GUI pesadilla! Este trabajo, como por arte de magia
    • Poner esto como condición , para que no se bloquee en iOS 6.0 si ([auto respondsToSelector:@selector(edgesForExtendedLayout)])
    • Tengo un problema con este código, tengo la vista de la tabla dentro de la vista y después de la aplicación de esta tabla de códigos de vista va más allá de los obligados.
    • Como se ha mencionado por AnswerBot, este código se empuje la parte inferior de la vista fuera de la pantalla. Usted tendrá que compensar para que mediante la modificación de la altura de la vista de tabla.
    • También tenga en cuenta que cuando su vista principal es un UITableView la viewDidLayoutSubviews se llaman en cada desplazamiento. Su UITableView deberán reducirse hasta su altura es de 15px. Añadir un indicador para que se ejecute este código sólo una vez. 😉
    • ¿por qué no cambiar el marco en lugar de los límites ?
    • Usted puede cambiar el marco y va a trabajar. La razón por la que he cambiado los límites es porque yo terminé utilizando el código de Apple siempre, y que ya se utiliza límites, así que trabajé con eso. Ver el enlace de la fuente que he proporcionado.
    • La reja!!! funciona bien tanto en iOS6 & iOS 7, pero he visto a mi UIToolBar camisería la parte inferior a la parte superior con un poco de color en iOS 7 por 2 segundos. alguna sugerencia?? Gracias

  4. 28

    Swift 3 /Swift 4 solución que también funciona con Puntas/XIB archivos en iOS 10+:

    override func viewDidLoad() {
        super.viewDidLoad()
    
        edgesForExtendedLayout = []
    }
    • Esto es Lo que me Ayudó… Así de Simple. Gracias 🙂
    • Gracias es muy útil
    • Esta es la mejor solución para 10.x Swift 3+ IMO
    • Funciona, sin embargo no sé por qué.
  5. 10

    Si quieres que la vista tiene la translúcido de la barra de navegación (que es algo bueno) tiene la configuración de un contentInset o similar.

    He aquí cómo hacerlo:

    //Check if we are running on ios7
    if([[[[UIDevice currentDevice] systemVersion] componentsSeparatedByString:@"."][0] intValue] >= 7) {
          CGRect statusBarViewRect = [[UIApplication sharedApplication] statusBarFrame];
          float heightPadding = statusBarViewRect.size.height+self.navigationController.navigationBar.frame.size.height;
    
          myContentView.contentInset = UIEdgeInsetsMake(heightPadding, 0.0, 0.0, 0.0);
    }
    • ¿cuál es el requisito para dividir 7.0 en 7 y 0 ??? @Magnus
    • por qué no se pueden comparar directamente con 7.0
    • lol voy a conseguir: la comprobación en contra de una versión específica con menores añadido es menos robusto. Pero usted está comprobando si el valor es MAYOR o igual a por lo que comparar a 7.0 estaría bien aquí 😉
    • Esta es la cuenta de 7.x y más tarde – así que comprobar si la versión 7 o superior y omitir las revisiones menores en el cheque.
    • Tuve un problema con mi formato tableview beeing que aparece detrás de mi Tabbar. Lo que hizo la última fila de mi mesa nunca para desplazarse por encima de la Tabbar. Me fijo como que: myTableView.contentInset = UIEdgeInsetsMake(0, 0.0, TabbarHeight, 0)
    • contentInset es una propiedad de UIScrollView. ¿Y si mi vista no es una subclase de UIScrollView. Entonces, ¿cómo puedo solucionar el problema de la superposición?
    • BOOL ios7 = [[UIDevice currentDevice] systemMajorVersion] == 7;
    • Esta es la mejor solución para mi propósito. Para hacerlo mejor, collectionView.scrollIndicatorInsets debe ser demasiado. Y translúcido tiene sentido en la mayoría de circunstancias, si la vista no es un scrollView.

  6. 9

    edgesForExtendedLayout hace el truco para iOS 7. Sin embargo, si se construye la app en iOS 7 SDK y se implementa en iOS 6, la barra de navegación aparece translúcido y de las opiniones que van por debajo de ella. Así que, para solucionarlo tanto para iOS 7, así como para iOS 6 hacer esto:

    self.navigationController.navigationBar.barStyle = UIBarStyleBlackOpaque;
    if ([self respondsToSelector:@selector(edgesForExtendedLayout)])
        self.edgesForExtendedLayout = UIRectEdgeNone;   //iOS 7 specific
  7. 9

    En sus aplicaciones plist archivo agregar una fila, llamado «controlador de Vista basados en la barra de estado de la apariencia» y seleccione NO.

  8. 7

    El más simple truco es abrir el NIB archivo y hacer estos dos sencillos pasos:

    1. Acaba de activar y seleccione el que prefiera:

    Barra de estado y la barra de navegación aparecer en mi opinión límites en iOS 7

    1. Seleccionar aquellos UIView s/UIIMageView es/… que quieres ser movido hacia abajo. En mi caso, sólo el logotipo se superponía una que me he fijado en el delta a +15; (O -15 si usted eligió iOS 7 en el paso 1)

    Barra de estado y la barra de navegación aparecer en mi opinión límites en iOS 7

    Y el resultado:

    Barra de estado y la barra de navegación aparecer en mi opinión límites en iOS 7
    Barra de estado y la barra de navegación aparecer en mi opinión límites en iOS 7

    • Funciona, pero este aspecto como un duro para mantener la solución. Sería mejor solucionar el problema en lugar de reparándolos.
    • sería mejor hacerlo mediante programación para todos los de la vista subvistas porque no funciona si se aplica a la vista principal
  9. 5

    Solución Rápida:

    override func viewWillAppear(animated: Bool) {
        super.viewWillAppear(animated)
        self.edgesForExtendedLayout = UIRectEdge.None
    }
    • Este es ahora edgesForExtendedLayout = []
    • Dado que esta es una respuesta pública no nos olvidemos de llamada: super.viewWillAppear(animated)
  10. 4

    Me gustaría ampliar en la Maravilla de la respuesta, y añadir un if instrucción para comprobar si es iOS 7, cuando lo he probado en iOS 6 que mi aplicación se bloquee.

    La suma sería la adición de:

    if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0)

    Así que me gustaría sugerir la adición de este método para su MyViewControler.m de archivo:

    - (void) viewDidLayoutSubviews {
        if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0) {
            CGRect viewBounds = self.view.bounds;
            CGFloat topBarOffset = self.topLayoutGuide.length;
            viewBounds.origin.y = topBarOffset * -1;
            self.view.bounds = viewBounds;
        }
    }
  11. 3

    Tengo un escenario en el que yo uso la BannerViewController escrito por Apple para mostrar mis anuncios y un ScrollViewController incrustado en el BannerViewController.

    Para evitar que la barra de navegación de ocultar el contenido de mi, he tenido que hacer dos cambios.

    1) Modificar BannerViewController.m

    - (void)viewDidLoad
    {
       [super viewDidLoad];
       float systemVersion = [[[UIDevice currentDevice] systemVersion] floatValue];
       if (systemVersion >= 7.0) {
          self.edgesForExtendedLayout = UIRectEdgeNone;
       }
    }

    2) Modificar mi ScrollViewContoller

    - (void)viewDidLoad
    {
        [super viewDidLoad];
        float systemVersion = [[[UIDevice currentDevice] systemVersion] floatValue];
        if (systemVersion >= 7.0) {
            self.edgesForExtendedLayout = UIRectEdgeBottom;
        }
    }

    Ahora los anuncios se muestran correctamente en la parte inferior de la vista, en lugar de estar cubierto por la barra de Navegación y el contenido en la parte superior no esté cortado.

  12. 2

    establecido el siguiente código en la vista aparecerá.

      if ([[[UIDevice currentDevice] systemVersion] floatValue]<= 7) {
    self.edgesForExtendedLayout = UIRectEdgeNone;
     }
    • Esta es la única cosa que trabajó en mi circunstancia.
  13. 1

    Para mí, la solución más sencilla es añadir dos teclas en el plist

    Barra de estado y la barra de navegación aparecer en mi opinión límites en iOS 7

    • +1, yo tenía la «barra de Estado inicialmente oculto»=SÍ, pero cuando la adición de «controlador de Vista basados en la barra de estado de la apariencia»=NO me deshice de la barra de estado.
  14. 1

    Agregar la clave «Controlador de Vista basados en la barra de estado de apariencia» en el dropdownlist como una fila en info.plist. Algo como esto:

    Barra de estado y la barra de navegación aparecer en mi opinión límites en iOS 7

    • No ayuda…
    • interesante.ayudó en mi cocos2d proyectos.como puedo activar esta opción puedo ver la parte superior de la barra de estado es completamente ha ido o aparecer.
  15. 1

    Tuve el mismo problema con mi aplicación por iPads (armv7, armv7s, amr64) sólo mediante la presentación de otra UIViewController y después de despedir de ellos va de la barra de navegación debajo de la barra de estado…
    Me pasan un montón de tiempo para encontrar alguna solución para eso. Estoy usando el guión y en InterfaceBuilder para UIViewController que hace terrible me puse Presentación de pantalla Completa -> Contexto Actual y solucionar este problema. Funciona en mi app para ipad => iOS8.0 (pruebas con iOS8.1) y para el ipad con iOS 7.1 no funciona!! Barra de estado y la barra de navegación aparecer en mi opinión límites en iOS 7

    • En mi caso, mi vista principal fue la superposición de mi tabBar y yo no tenía Idea de por qué. Resulta que el Extender los Bordes > en Virtud de Barras del Fondo fue controlado. Fue muy difícil notarlo porque el fondo de mi aplicación fue en blanco y sólo se genera algún nivel de opacidad sobre mi tabBar. Gracias!
  16. 1

    Swift 4.2 – Xcode 10.0 – iOS 12.0:

    if #available(iOS 11.0, *) {} else {
      self.edgesForExtendedLayout = []
      self.navigationController?.view.backgroundColor = .white
    }
  17. 0

    Pasos Para Ocultar la barra de estado de iOS 7:

    1.Vaya a su solicitud de información.plist archivo.

    2.Y Establecer, a la Vista basada en el controlador de la barra de estado apariencia : Boolean NO

    Esperanza he resuelto la barra de estado de la cuestión…..

  18. 0

    En mi caso tener loadView() interrumpe

    este código:
    auto.edgesForExtendedLayout = UIRectEdgeNone

    pero después de eliminar loadView() todo funcionaba bien

Dejar respuesta

Please enter your comment!
Please enter your name here