31 votes

Pourquoi la page de Pousser animation Tabbar le déplacement jusqu'à l'iPhone X

- Je construire une application de Démonstration, utilisez hidesBottomBarWhenPushed cacher Tabbar dans la Poussée de l'Animation.

Page Relationship

Mais, Lorsque je clique sur le Bouton de Saut Tabbar déplacer vers le haut!? comme ceci: Tabbar Move up

14voto

Réponse fournie par VoidLess correctifs TabBar problèmes que partiellement. Il corrige les problèmes de mise en page à l'intérieur de tabbar, mais si vous utilisez viewcontroller qui cache tabbar, la tabbar est rendu de manière incorrecte lors des animations (à reproduire, il est préférable 2 ont 2 enchaîne un modal et une pression. Si vous alternez les enchaîne, vous pouvez voir tabbar rendu de celui-ci). Voir le code soufflet qui résout les deux problèmes. Bon travail d'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
        }
    }
}
}

Code 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

9voto

xu tong Points 369

C'est ma façon。 Déclarer une sous-classe de UITabBar, comme ActionTabBar

swift 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
        }
    }
}

Objective-C

@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

2voto

sukeyang Points 21

Déclarer une sous-classe 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;
    }

2voto

Jeff Zhang Points 51

Edit: Après la sortie de 12.1.1, ce problème a été résolu. Vous pouvez conserver la structure d'origine.


Si vous changez la structure de

UITabBarController -> UINavigationController -> UIViewController

pour

UINavigationController -> UITabBarController -> UIViewController

vous trouverez ce problème a été résolu. Je ne sais vraiment pas pourquoi Apple ne corrige pas ce problème.

Dans iOS 12.1, ce problème devient de plus en plus graves. Vous pouvez voir la TabBar texte sauter au-dessus de la TabBar à chaque fois, si vous utilisez le geste à la pop de retour.

Remarque: de Cette façon, peut certainement résoudre ce problème, mais je ne suis pas sûr de savoir si c'est une bonne idée. Aussi, si votre structure est assez compliqué, vous avez besoin de changer beaucoup de choses.

0voto

ximmyxiao Points 671

je vais vous donner une autre solution pour ce bug(semble qu'apple fait).

et la solution n'est pas d'interdire la tabbar déplacer vers le haut , mais pour faire de la zone noire n'apparaîtra pas lorsque tabbar déplacer vers le haut

le noyau chose, c'est d'ajouter une sous-vue pour votre viewcontroller comme le plus profond sous-vue et cette sous-vue de l'image est la taille de la fenêtre.ainsi, lorsque la tabbar déplace vers le haut , ce sous-vue sera montré insteadof zone noire

if (@available(iOS 11.0, *)) {
    UIView* bgView = [[UIView alloc] initWithFrame:[UIScreen mainScreen].bounds];
    bgView.autoresizingMask = UIViewAutoresizingNone;
    bgView.backgroundColor = UIColorFromRGB(0xefeff4);
    [self.view addSubview:bgView];

}

le confort de cette méthode est que vous n'aurez pas à sous-classe tabbar ou remplacer navigationcontroller de la méthode push

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X