En el nuevo iPhone X, ¿cuál sería la forma más adecuada de obtener la altura superior e inferior para las áreas inseguras?
ios
iphone-x
safearealayoutguide
Tulleb
fuente
fuente
keyWindow
siempre fuenil
así que lo cambiéwindows[0]
y lo eliminé del?
encadenamiento opcional, luego funcionó.Para obtener la altura entre las guías de diseño, simplemente haz
Por lo tanto
full frame height = 812.0
,safe area height = 734.0
A continuación se muestra el ejemplo donde la vista verde tiene un marco de
guide.layoutFrame
fuente
UIApplication.sharedApplication.keyWindow.safeAreaLayoutGuide.layoutFrame
, que tiene el marco seguro.Swift 4, 5
Para anclar una vista a un ancla de área segura, se pueden usar restricciones en cualquier parte del ciclo de vida del controlador de vista porque la API las pone en cola y las maneja después de que la vista se haya cargado en la memoria. Sin embargo, obtener valores de área segura requiere esperar hacia el final del ciclo de vida de un controlador de vista, como
viewDidLayoutSubviews()
.Esto se conecta a cualquier controlador de vista:
Prefiero este método a sacarlo de la ventana (cuando sea posible) porque es cómo se diseñó la API y, lo que es más importante, los valores se actualizan durante todos los cambios de vista, como los cambios de orientación del dispositivo.
Sin embargo, algunos controladores de vista personalizados no pueden usar el método anterior (sospecho que están en vistas de contenedor transitorio). En tales casos, puede obtener los valores del controlador de vista raíz, que siempre estará disponible en cualquier parte del ciclo de vida del controlador de vista actual.
fuente
viewDidLayoutSubviews
(que se puede llamar varias veces), aquí hay una solución que funcionará incluso enviewDidLoad
: stackoverflow.com/a/53864017/7767664Ninguna de las otras respuestas aquí funcionó para mí, pero esto sí.
fuente
Todas las respuestas aquí son útiles, gracias a todos los que ofrecieron ayuda.
Sin embargo, como veo que el tema del área segura está un poco confundido, lo que no parece estar bien documentado.
Así que lo resumiré aquí lo más rápido posible para que sea fácil de entender
safeAreaInsets
,safeAreaLayoutGuide
yLayoutGuide
.En iOS 7, Apple introdujo las propiedades
topLayoutGuide
ybottomLayoutGuide
enUIViewController
, le permitieron crear restricciones para evitar que su contenido se ocultara en barras UIKit como el estado, la navegación o la barra de pestañas. Con estas guías de diseño era posible especificar restricciones en el contenido, evitándolo estar oculto por los elementos de navegación superior o inferior (barras UIKit, barra de estado, barra de navegación o pestaña ...).Entonces, por ejemplo, si quieres hacer que una vista de tabla comience desde la pantalla superior, has hecho algo así:
En iOS 11, Apple ha desaprobado estas propiedades reemplazándolas con una sola guía de diseño de área segura
Área segura según Apple
A continuación, un área segura resaltada en iPhone 8 y iPhone X-series:
El
safeAreaLayoutGuide
es una propiedad deUIView
Para obtener la altura de
safeAreaLayoutGuide
:Eso devolverá la altura de la flecha en su imagen.
Ahora, ¿qué pasa con la obtención de las alturas de los indicadores de "muesca" superior e inferior de la pantalla de inicio?
Aquí usaremos el
safeAreaInsets
A continuación se mostrará el área insegura y la distancia desde los bordes en el iPhone 8 y uno de la serie X del iPhone.
Ahora, si se agrega la barra de navegación
Entonces, ¿cómo obtener la altura del área insegura? usaremos el
safeAreaInset
Aquí hay soluciones, sin embargo, difieren en algo importante,
El primero:
Eso devolverá los EdgeInsets, ahora puede acceder a la parte superior e inferior para conocer las inserciones,
Segundo:
El primero está tomando los recuadros de vista, por lo que si hay una barra de navegación se considerará, sin embargo, el segundo está accediendo a safeAreaInsets de la ventana, por lo que la barra de navegación no se considerará
fuente
En iOS 11 hay un método que indica cuándo SafeArea ha cambiado.
fuente
Swift 5, Xcode 11.4
Dará una advertencia de desaprobación. 'keyWindow' quedó en desuso en iOS 13.0: no debe usarse para aplicaciones que admitan varias escenas, ya que devuelve una ventana clave en todas las escenas conectadas 'debido a las escenas conectadas. Yo uso de esta manera.
fuente
Estoy trabajando con los marcos CocoaPods y, en caso de
UIApplication.shared
que no esté disponible , lo usosafeAreaInsets
en viewwindow
:fuente
safeAreaLayoutGuide Cuando la vista es visible en pantalla, esta guía refleja la parte de la vista que no está cubierta por barras de navegación, barras de pestañas, barras de herramientas y otras vistas de antepasados. (En tvOS, el área segura refleja el área que no cubre el bisel de la pantalla). Si la vista no está instalada actualmente en una jerarquía de vistas o aún no está visible en la pantalla, los bordes de la guía de diseño son iguales a los bordes de la vista.
Luego, para obtener la altura de la flecha roja en la captura de pantalla, es:
fuente
Objective-C ¿Quién tuvo el problema cuando keyWindow es igual a nil ? Simplemente ponga el código de arriba en viewDidAppear (no en viewDidLoad)
fuente
fuente
Extensión Swift 5
Esto se puede usar como una extensión y llamar con: UIApplication.topSafeAreaHeight
La extensión de la aplicación UIA es opcional, puede ser una extensión de UIView o lo que sea preferido, o probablemente incluso una función global.
fuente
Un enfoque más redondeado
fuente
Para aquellos de ustedes que cambian al modo horizontal, deben asegurarse de usar viewSafeAreaInsetsDidChange después de la rotación para obtener los valores más actualizados:
fuente