He estado leyendo mucho sobre la transición de la interfaz de usuario de iOS7.
No soy capaz de conseguir lo que estas tres propiedades 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.
ios
objective-c
xcode
uiviewcontroller
ios7
usuario1010819
fuente
fuente
Respuestas:
A partir de iOS7, los controladores de vista usan el diseño de pantalla completa de forma predeterminada. Al mismo tiempo, tienes más control sobre cómo presenta sus vistas, y eso se hace con esas propiedades:
edgeForExtendedLayout
Básicamente, con esta propiedad usted establece qué lados de su vista se pueden extender para cubrir toda la pantalla. Imagina que empujas un
UIViewController
aUINavigationController
. Cuando se presenta 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:
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 extienda la vista para cubrir la pantalla:Y el resultado:
automaticAdjustsScrollViewInsets
Esta propiedad se usa cuando su vista es una
UIScrollView
o similar, como unaUITableView
. Desea que su tabla comience donde termina la barra de navegación, porque de lo contrario no verá todo el contenido, pero al mismo tiempo desea que su tabla cubra toda la pantalla al desplazarse. En ese caso, establecerloedgesForExtendedLayout
en Ninguno no funcionará porque su 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 deja que el controlador de vista ajuste automáticamente las inserciones (estableciendo esta propiedad en SÍ, también el valor predeterminado) agregará inserciones en 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. Por defecto, este parámetro está establecido en NO. Si la barra de estado es opaca, las vistas no se extenderán para incluir la barra de estado, incluso si extiende su vista para cubrirla (
edgesForExtendedLayout
aUIRectEdgeAll
).Si establece el valor en SÍ, esto permitirá que la vista vuelva a estar 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 que está en el índice 0, y si es una subclase de,
UIScrollView
entonces le aplica las propiedades explicadas.Por supuesto, esto significa que
UITableViewController
funciona de forma predeterminada (ya queUITableView
es la primera vista).fuente
No estoy seguro si está usando guiones gráficos, pero si lo está, para que sus controladores de vista comiencen debajo de la barra de estado (y arriba de la barra inferior):
Seleccione el controlador de vista en IB. En el inspector de atributos, anule la selección de 'Extender bordes: debajo de las barras superiores' y 'Extender bordes: debajo de las barras inferiores'.
fuente
Estoy usando guiones gráficos y los consejos anteriores funcionaron, sin embargo, no estaba exactamente 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.
Mi problema: Ajuste automático establecido en verdadero de forma predeterminada, lo que causa una diferencia entre el diseño del guión gráfico y el simulador
Resuelto: se aplicó el código anterior, desactivando el ajuste automático.
fuente
Resolví este problema agregando esta línea, pero mi problema estaba relacionado con un
UIView
, noUIScrollView
fuente
Solo tenga en cuenta que la
automaticallyAdjustsScrollViewInsets
propiedad solo funciona si algún tipo de vista de desplazamiento (vista de tabla, vista de colección, ...)Otro sugirió que 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 en constante como 44 o 64 o incluso 20 como muchos sugieren alrededor de SO. No se puede saber el tamaño nunca. Puede haber una notificación de llamada / gps / audio, la barra de navegación no tiene que ser siempre 44 pts, etc.
Creo que la mejor solución es usar layoutGuide
length
en didLayoutSubviews:Puede usar bottomLayoutGuide de la misma manera.
fuente