ios - señal - ¿Por qué la página Empujar animación Tabbar moviéndose hacia arriba en el iPhone X
puntos de señal iphone (6)
Construyo una aplicación de demostración, uso hidesBottomBarWhenPushed ocultar tabbar en Push Animation.
Pero, cuando hago clic en el botón Saltar, ¿la barra de pestañas sube? Me gusta esto:
Declara una subclase de NavigationController
@implementation XXNavigationController
- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated {
[super pushViewController:viewController animated:animated];
CGRect frame = self.tabBarController.tabBar.frame;
frame.origin.y = [UIScreen mainScreen].bounds.size.height - frame.size.height;
self.tabBarController.tabBar.frame = frame;
}
Esta es mi manera。 Declarar una subclase de UITabBar, como ActionTabBar
veloz 3,4
class ActionTabBar: UITabBar {
override var frame: CGRect {
get {
return super.frame
}
set {
var tmp = newValue
if let superview = self.superview, tmp.maxY != superview.frame.height {
tmp.origin.y = superview.frame.height - tmp.height
}
super.frame = tmp
}
}
}
C objetivo
@implementation ActionTabbar
- (void)setFrame:(CGRect)frame
{
if (self.superview && CGRectGetMaxY(self.superview.bounds) != CGRectGetMaxY(frame)) {
frame.origin.y = CGRectGetHeight(self.superview.bounds) - CGRectGetHeight(frame);
}
[super setFrame:frame];
}
@end
Este problema parece solucionado en iOS 11.2
La respuesta proporcionada por VoidLess soluciona los problemas de TabBar solo parcialmente. Corrige los problemas de diseño dentro de la barra de pestañas, pero si usa el controlador de visualización que oculta la barra de tabulación, la barra de tabulación se procesa incorrectamente durante las animaciones (para reproducirlo es mejor que 2 tengan 2 segmentos: uno modal y un push. Si alterna los segmentos, puede ver la barra de pestañas siendo prestado fuera de lugar). Vea el siguiente código que soluciona ambos problemas. Buen trabajo apple
class SafeAreaFixTabBar: UITabBar {
var oldSafeAreaInsets = UIEdgeInsets.zero
@available(iOS 11.0, *)
override func safeAreaInsetsDidChange() {
super.safeAreaInsetsDidChange()
if oldSafeAreaInsets != safeAreaInsets {
oldSafeAreaInsets = safeAreaInsets
invalidateIntrinsicContentSize()
superview?.setNeedsLayout()
superview?.layoutSubviews()
}
}
override func sizeThatFits(_ size: CGSize) -> CGSize {
var size = super.sizeThatFits(size)
if #available(iOS 11.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
}
}
}
}
Código Objective-C:
@implementation VSTabBarFix {
UIEdgeInsets oldSafeAreaInsets;
}
- (void)awakeFromNib {
[super awakeFromNib];
oldSafeAreaInsets = UIEdgeInsetsZero;
}
- (void)safeAreaInsetsDidChange {
[super safeAreaInsetsDidChange];
if (!UIEdgeInsetsEqualToEdgeInsets(oldSafeAreaInsets, self.safeAreaInsets)) {
[self invalidateIntrinsicContentSize];
if (self.superview) {
[self.superview setNeedsLayout];
[self.superview layoutSubviews];
}
}
}
- (CGSize)sizeThatFits:(CGSize)size {
size = [super sizeThatFits:size];
if (@available(iOS 11.0, *)) {
float bottomInset = self.safeAreaInsets.bottom;
if (bottomInset > 0 && size.height < 50 && (size.height + bottomInset < 90)) {
size.height += bottomInset;
}
}
return size;
}
- (void)setFrame:(CGRect)frame {
if (self.superview) {
if (frame.origin.y + frame.size.height != self.superview.frame.size.height) {
frame.origin.y = self.superview.frame.size.height - frame.size.height;
}
}
[super setFrame:frame];
}
@end
Solo necesita agregar una imagen de lanzamiento específicamente para iPhone X al catálogo de activos (porque usa @ 3x) de tamaño 1125 x 2436.
Espero que esto resuelva tu problema.
Voy a proporcionar otra solución para este error (parece Apple hecho).
y la solución no es prohibir que la barra de pestañas se mueva hacia arriba, sino hacer que el área negra no se muestre cuando la barra de pestañas se mueva hacia arriba
lo principal es agregar una subvista a su controlador de visualización a medida que la subvista más profunda y el marco de esta subvista es el tamaño de la ventana. Así, cuando la barra de pestañas se mueve hacia arriba, se mostrará esta subvista en lugar de un área negra.
if (@available(iOS 11.0, *)) {
UIView* bgView = [[UIView alloc] initWithFrame:[UIScreen mainScreen].bounds];
bgView.autoresizingMask = UIViewAutoresizingNone;
bgView.backgroundColor = UIColorFromRGB(0xefeff4);
[self.view addSubview:bgView];
}
La conveniencia de este método es que no tendrá que crear una subclase de la barra de pestañas ni sobrescribir el método push del controlador de navegación.