guide - safe area ios
Estoy trabajando con los marcos CocoaPods y en caso de que
UIApplication.shared
no
esté
disponible,
entonces uso
safeAreaInsets
en la
window
de visualización:
if #available(iOS 11.0, *) {
let insets = view.window?.safeAreaInsets
let top = insets.top
let bottom = insets.bottom
}
Ninguna de las otras respuestas aquí funcionó para mí, pero esto sí.
var topSafeAreaHeight: CGFloat = 0
var bottomSafeAreaHeight: CGFloat = 0
if #available(iOS 11.0, *) {
let window = UIApplication.shared.windows[0]
let safeFrame = window.safeAreaLayoutGuide.layoutFrame
topSafeAreaHeight = safeFrame.minY
bottomSafeAreaHeight = window.frame.maxY - safeFrame.maxY
}
Para obtener la altura entre las guías de diseño, simplemente haz
let guide = view.safeAreaLayoutGuide
let height = guide.layoutFrame.size.height
Entonces
full frame height = 812.0
,
safe area height = 734.0
A continuación se muestra el ejemplo donde la vista verde tiene el marco de
guide.layoutFrame
Prueba esto :
En el objetivo C
if (@available(iOS 11.0, *)) {
UIWindow *window = UIApplication.sharedApplication.keyWindow;
CGFloat topPadding = window.safeAreaInsets.top;
CGFloat bottomPadding = window.safeAreaInsets.bottom;
}
En veloz
if #available(iOS 11.0, *) {
let window = UIApplication.shared.keyWindow
let topPadding = window?.safeAreaInsets.top
let bottomPadding = window?.safeAreaInsets.bottom
}
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)
Swift 4
Para anclar una vista a un ancla de área segura, se pueden usar restricciones en cualquier punto del ciclo de vida del controlador de vista porque la API de diseño automático maneja las restricciones detrás de escena.
Sin embargo, acceder a los valores de esas áreas seguras para determinar sus alturas requiere esperar hasta más adelante en el ciclo de vida del controlador de vista, idealmente
viewDidLayoutSubviews()
.
Esto se conecta a cualquier controlador de vista:
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
var topSafeArea: CGFloat
var bottomSafeArea: CGFloat
if #available(iOS 11.0, *) {
topSafeArea = view.safeAreaInsets.top
bottomSafeArea = view.safeAreaInsets.bottom
} else {
topSafeArea = topLayoutGuide.length
bottomSafeArea = bottomLayoutGuide.length
}
// safe area values are now available to use
}
Prefiero este método a sacarlo de la ventana porque así es como Apple diseñó la API para ser utilizada.
No haga referencia a objetos extraños como la ventana cuando todo ya está en el controlador de vista.
Y al usar
viewDidLayoutSubviews()
, los valores de área segura se actualizan durante los cambios de orientación, las barras de estado de doble altura y todas las demás mutaciones en la vista y sus áreas seguras.