ios - custom - navigation bar iphone x
¿Espacio extra/relleno en el iPhone X? (5)
En el iPhone X en modo retrato, si establece una restricción inferior en área segura a 0, obtendrá un espacio adicional en la parte inferior de la pantalla. ¿Cómo se obtiene mediante programación la altura de este relleno adicional?
Me las arreglé para determinar manualmente la altura de este relleno, que es de 34 y aquí es cómo pude implementarlo con detección de iPhone X
Swift 4.0 y Xcode 9.0
if UIDevice().userInterfaceIdiom == .phone
{
switch UIScreen.main.nativeBounds.height
{
case 2436: //iPhone X
self.keyboardInAppOffset.constant = -34.0
default:
self.keyboardInAppOffset.constant = 0
}
}
¿Hay una forma más limpia de detectar la altura de este relleno?
En Objective-C
if (@available(iOS 11.0, *)) {
UIWindow *window = UIApplication.sharedApplication.keyWindow;
CGFloat bottomPadding = window.safeAreaInsets.bottom;
}
En iOS 11, las vistas tienen una propiedad safeAreaInsets
. Si obtiene la propiedad bottom
de estas inserciones, puede obtener la altura del relleno inferior mientras está en el iPhone X:
if #available(iOS 11.0, *) {
let bottomPadding = view.safeAreaInsets.bottom
// ...
}
(Igualmente para el relleno superior con barra de estado)
Si de repente no tiene una vista, por ejemplo, CollectionViewLayout, también puede recuperarla desde la ventana:
private static var itemHeight: CGFloat {
guard #available(iOS 11.0, *),
let window = UIApplication.shared.keyWindow else {
return Constants.itemHeight
}
return Constants.itemHeight - window.safeAreaInsets.bottom
}
Use esta línea para convertirse en su valor más bajo para iPhoneX
if #available(iOS 11.0, *) {
let bottomPadding = view.safeAreaInsets.bottom
}
y no olvide agregar esto en layoutSubviews () porque safeAreaInsets tiene el tamaño correcto en layoutSubviews () de lo contrario, se convertirá en valores erróneos.
var bottomPadding: CGFloat = 0.0
if #available(iOS 11.0, *) {
let window = UIApplication.shared.keyWindow
bottomPadding = window?.safeAreaInsets.bottom ?? 0.0
}
Ahora puede utilizar el bottomPadding
según sus necesidades.