bar ios objective-c xcode uiviewcontroller ios7

uinavigationbar ios



Explicación de la diferencia entre ajustes automáticos, conjuntos de vistas de desplazamiento, valores extendidos de lúbricas, barras de emparejamiento, bordes, lúminas extendidas en iOS7 (5)

A partir de iOS7, los controladores de vista utilizan el diseño de pantalla completa de forma predeterminada. Al mismo tiempo, tiene más control sobre la forma en que expone sus vistas, y eso se hace con esas propiedades:

edgesForExtendedLayout

Básicamente, con esta propiedad usted establece qué lados de su vista se pueden ampliar para cubrir toda la pantalla. Imagine que empuja un UIViewController en un UINavigationController . Cuando se distribuya la vista de ese controlador de vista, comenzará donde termina la barra de navegación, pero esta propiedad establecerá qué lados de la vista (arriba, izquierda, abajo, derecha) se pueden extender para llenar toda la pantalla.

Veamos con un ejemplo:

UIViewController *viewController = [[UIViewController alloc] init]; viewController.view.backgroundColor = [UIColor redColor]; UINavigationController *mainNavigationController = [[UINavigationController alloc] initWithRootViewController:viewController];

Aquí no está configurando el valor de edgesForExtendedLayout , por lo tanto, se toma el valor predeterminado ( UIRectEdgeAll ), por lo que la vista extiende su diseño para llenar toda la pantalla.

Este es el resultado:

Como puede ver, el fondo rojo se extiende detrás de la barra de navegación y la barra de estado.

Ahora, va a establecer ese valor en UIRectEdgeNone , por lo que le está diciendo al controlador de vista que no amplíe la vista para cubrir la pantalla:

UIViewController *viewController = [[UIViewController alloc] init]; viewController.view.backgroundColor = [UIColor redColor]; viewController.edgesForExtendedLayout = UIRectEdgeNone; UINavigationController *mainNavigationController = [[UINavigationController alloc] initWithRootViewController:viewController];

Y el resultado:

automaticAdjustsScrollViewInsets

Esta propiedad se usa cuando su vista es un UIScrollView o similar, como un UITableView . Desea que su tabla comience donde la barra de navegación termina, ya que no verá todo el contenido si no, pero al mismo tiempo desea que su tabla cubra toda la pantalla cuando se desplaza. En ese caso, la configuración de edgesForExtendedLayout en None no funcionará porque la tabla comenzará a desplazarse hacia donde termina la barra de navegación y no irá detrás de ella.

Aquí es donde esta propiedad es útil, si permite que el controlador de la vista ajuste automáticamente las inserciones (estableciendo esta propiedad en SÍ, también el valor predeterminado) agregará las inserciones a la parte superior de la tabla, por lo que la tabla comenzará donde la navegación La barra termina, pero el desplazamiento cubrirá toda la pantalla.

Esto es cuando se establece en NO:

Y SÍ (por defecto):

En ambos casos, la tabla se desplaza detrás de la barra de navegación, pero en el segundo caso (SÍ), comenzará desde debajo de la barra de navegación.

ExtendedLayoutIncludesOpaqueBars

Este valor es solo una adición a los anteriores. De forma predeterminada, este parámetro se establece en NO. Si la barra de estado es opaca, las vistas no se ampliarán para incluir la barra de estado, incluso si extiende su vista para cubrirla ( edgesForExtendedLayout to UIRectEdgeAll ).

Si establece el valor en SÍ, esto permitirá que la vista vuelva a aparecer debajo de la barra de estado.

Si algo no está claro, escribe un comentario y lo responderé.

¿Cómo sabe iOS qué UIScrollView usar?

iOS toma la primera subvista en la vista de su ViewController, la del índice 0, y si es una subclase de UIScrollView le aplica las propiedades explicadas.

Por supuesto, esto significa que UITableViewController funciona de forma predeterminada (ya que UITableView es la primera vista).

He estado leyendo mucho sobre la transición de la interfaz de usuario de iOS7.

No puedo obtener lo que estas tres propiedades edgesForExtendedLayout automaticallyAdjustsScrollViewInsets , extendedLayoutIncludesOpaqueBars , edgesForExtendedLayout ?

Por ejemplo, estoy tratando de hacer que mis controladores de vista comiencen debajo de la barra de estado pero no puedo lograrlo.


Estoy usando guiones gráficos y el consejo anterior funcionó, pero no estaba muy seguro de cómo implementarlo. A continuación se muestra un breve ejemplo de cómo solucionó el problema al poner la solución recomendada en el ViewController.

import Foundation import UIKit // This ViewController is connected to a view on a storyboard that // has a scrolling sub view. class TheViewController: UIViewController { // Prepares the view prior to loading. Putting it in viewDidAppear didn''t work. override func viewWillAppear(animated: Bool) { // this method is an extension of the UIViewController // so using self works as you might expect. self.automaticallyAdjustsScrollViewInsets = false // Default is "true" so this sets it to false tells it to use // the storyboard as you have it placed // and not how it thinks it should place it. } }

Mi problema: el ajuste automático se establece en verdadero de forma predeterminada y causa una diferencia entre el diseño del guión gráfico y el simulador

Resuelto: Código arriba aplicado, desactivando el autoajuste.


No estoy seguro de si está utilizando guiones gráficos, pero si lo está, para hacer que sus controladores de vista se inicien debajo de la barra de estado (y arriba de la barra inferior):

Seleccione el controlador de vista en IB, en el inspector de atributos, deseleccione ''Extender bordes - Debajo de las barras superiores'' y ''Extender bordes - Debajo de las barras inferiores''.


Resolví este problema agregando esta línea, pero mi problema estaba relacionado con una UIView , no con UIScrollView

self.navigationController.navigationBar.translucent = NO;


Solo recuerde que automaticallyAdjustsScrollViewInsets propiedad automaticallyAdjustsScrollViewInsets funciona solo si algún tipo de vista de desplazamiento (vista de tabla, vista de colección, ...) es

  • La vista de VC, o
  • Primera subvista de esta vista.

Otros sugirieron que no funciona incluso si es la primera subvista, pero hay otras vistas de desplazamiento en la jerarquía de vistas.

EDITAR (extensión DIY)

Si desea un comportamiento similar, incluso si no puede cumplir estas condiciones (por ejemplo, tiene una imagen de fondo debajo de la vista de desplazamiento), puede ajustar las inserciones de la vista de desplazamiento manualmente. Pero, por favor, no lo establezca constantemente como 44 o 64 o incluso 20 como muchos sugieren alrededor de SO. Nunca se puede saber el tamaño. Puede haber la notificación de incall / gps / audio, la barra de navegación no tiene que ser siempre 44 pts, etc.

Creo que la mejor solución es usar la length de layoutGuide en didLayoutSubviews:

override func viewDidLayoutSubviews() { super.viewDidLayoutSubviews() scrollView.contentInset = UIEdgeInsets(top: topLayoutGuide.length, left: 0, bottom: 0, right: 0) scrollView.scrollIndicatorInsets = scrollView.contentInset }

Puede usar el bottomLayoutGuide de la misma manera.