ios - forzar - Cómo corregir el problema de altura de la barra de pestañas en iPhone X
Apple ya ha solucionado este problema en iOS 12.1.1
Crea un archivo separado con el siguiente código:
extension UITabBar {
override open func sizeThatFits(_ size: CGSize) -> CGSize {
super.sizeThatFits(size)
guard let window = UIApplication.shared.keyWindow else {
return super.sizeThatFits(size)
}
var sizeThatFits = super.sizeThatFits(size)
sizeThatFits.height = window.safeAreaInsets.bottom + 40
return sizeThatFits
}
}
En iOS 12.1 , he resuelto este problema al anular SafeAreaInsets en la subclase UITabBar:
class TabBar: UITabBar {
private var cachedSafeAreaInsets = UIEdgeInsets.zero
override var safeAreaInsets: UIEdgeInsets {
let insets = super.safeAreaInsets
if insets.bottom < bounds.height {
cachedSafeAreaInsets = insets
}
return cachedSafeAreaInsets
}
}
En restricciones -
Si está dando espacio inferior con la "Guía de diseño inferior", entonces se producirá este problema.
Solución:
Dar espacio al fondo con respecto a la supervisión. Esto funcionará 100% perfecto.
Esto funcionó para mí ya que estoy usando una imagen de selección.
tabBar.selectionIndicatorImage = UIImage.imageWithColor(color: UIColor.NewDesignColor.yellow, size: tabBarItemSize).resizableImage(withCapInsets: UIEdgeInsets.init(top: 0, left: 0, bottom: 20, right: 0))
Añadir una inserción inferior ayuda en mi caso. Espero que esto funcione para usted también. Gracias.
Hay UITabBar
subclase de UITabBar
que resuelve todos mis problemas con iPhone X iOS 11
/ iOS 12
class TabBar: UITabBar {
private var _safeAreaInsets = UIEdgeInsets.zero
private var _subviewsFrames: [CGRect] = []
@available(iOS 11.0, *)
override func safeAreaInsetsDidChange() {
super.safeAreaInsetsDidChange()
if _safeAreaInsets != safeAreaInsets {
_safeAreaInsets = safeAreaInsets
invalidateIntrinsicContentSize()
superview?.setNeedsLayout()
superview?.layoutSubviews()
}
}
override func sizeThatFits(_ size: CGSize) -> CGSize {
var size = super.sizeThatFits(size)
if #available(iOS 12.0, *) {
let bottomInset = safeAreaInsets.bottom
if bottomInset > 0 && size.height < 50 && (size.height + bottomInset < 90) {
size.height += bottomInset
}
}
return size
}
override var frame: CGRect {
get {
return super.frame
}
set {
var tmp = newValue
if let superview = superview, tmp.maxY !=
superview.frame.height {
tmp.origin.y = superview.frame.height - tmp.height
}
super.frame = tmp
}
}
override func layoutSubviews() {
super.layoutSubviews()
let state = subviews.map { $0.frame }
if (state.first { $0.width == 0 } == nil) {
_subviewsFrames = state
} else {
zip(subviews, _subviewsFrames).forEach { (view, rect) in
view.frame = rect
}
}
}
}
La solución para mí fue que tenía un conjunto de altura personalizado de UITabBar, algo como esto:
override func viewWillLayoutSubviews() {
var tabFrame = tabBar.frame
tabFrame.size.height = 60
tabFrame.origin.y = self.view.frame.size.height - 60
tabBar.frame = tabFrame
}
Elimínelo y la barra de pestañas se mostrará correctamente en el iPhone X.
Me encontré con el mismo problema. Afortunadamente, el siguiente post me salva. Estoy seguro de que puede solucionar su problema con él.
https://novemberfive.co/blog/apple-september-event-iphonex-apps/
Una técnica que utiliza una vista de base para que una Barra de barra de tareas (UITabBar) rellene el área inferior soluciona el problema que está sufriendo.
Para iOS 11.3 esto funcionó para mí:
func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
tabBar.invalidateIntrinsicContentSize()
}
Siga las pautas a continuación para configurar el indicador de imagen de UITabbar selectionIndicator.
- UITabBar.appearance (). SelectionIndicatorImage = #YOUR_IMAGE
- Asegúrate de que la altura de tu imagen sea 48.
La altura predeterminada de la selección de la barra de pestañasIndicatorImage es 49, pero en el iPhone X, la altura de imagen establecida es igual a 48.
Simplemente alinee la parte inferior de la barra de UIT con la vista de supervisión, no con el área segura. Si lo alineas con un área segura será así:
Y cuando se alinee con la supervisión, se mostrará correctamente:
Creo que esto se debe a que Apple dio a los elementos de la barra de pestañas un margen predeterminado en la parte inferior si está en el iPhone X, ya que quieren que la barra de pestañas se extienda a la parte inferior de la pantalla para evitar una barra flotante.
Tuve un problema similar. Estaba configurando el selectionIndicatorImage en viewDidLoad (). Mover el código a viewDidLayoutSubviews () solucionó mi problema.
invalideIntrinsicContentSize de UITabBar en viewWillLayoutSubviews que pueden ayudarlo.
override func viewWillLayoutSubviews() {
super.viewWillLayoutSubviews()
self.tabBar.invalidateIntrinsicContentSize()
}
El "inspector de archivos" a la derecha del guión gráfico de XCode, habilita el diseño de la guía del área segura para que sea compatible con su aplicación en iPhone
Este post describe realmente bien.