webentwicklung-frage-antwort-db.com.de

Warum Seite Push Animation Tabbar im iPhone X nach oben bewegen

Ich erstelle eine App-Demo und verwende hidesBottomBarWhenPushed, um die Tab-Leiste in der Push-Animation auszublenden.

Page Relationship

Aber wenn ich auf Jump Button Tabbar klicke, gehe ich nach oben !? so was: Tabbar Move up

31
Tommy

Die von VoidLess bereitgestellte Antwort behebt TabBar-Probleme nur teilweise. Es behebt Layoutprobleme innerhalb der Tab-Leiste. Wenn Sie jedoch einen Ansichts-Controller verwenden, der die Tab-Leiste verbirgt, wird die Tab-Leiste während der Animationen falsch gerendert fehl am Platz gerendert werden). Lesen Sie den folgenden Code, der beide Probleme behebt. Gute Arbeit, 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
        }
    }
}
}

Ziel-C-Code:

@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
14

Dies ist mein Weg。 Deklarieren Sie eine Unterklasse von UITabBar, z. B. ActionTabBar

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

Ziel 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
9
xu tong

Deklarieren Sie eine Unterklasse von 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;
    }
2
sukeyang

Bearbeiten: Nach der Veröffentlichung von 12.1.1 wurde dieses Problem behoben. Sie können die ursprüngliche Struktur beibehalten.


Wenn Sie Ihre Struktur von ändern

UITabBarController -> UINavigationController -> UIViewController

zu

UINavigationController -> UITabBarController -> UIViewController

sie werden feststellen, dass dieses Problem behoben wurde. Ich weiß wirklich nicht, warum Apple dieses Problem nicht behebt.

In iOS 12.1 wird dieses Problem schwerwiegender. Sie können sehen, dass der TabBar-Text jedes Mal über die TabBar springt , wenn Sie die Geste zum Zurückspringen verwenden.

Hinweis: Auf diese Weise kann dieses Problem definitiv gelöst werden, aber ich bin nicht sicher, ob es eine gute Idee ist. Auch wenn Ihre Struktur ziemlich kompliziert ist, müssen Sie viele Dinge ändern.

2
Jeff Zhang

ich werde eine andere Lösung für diesen Fehler anbieten (scheint Apple gemacht).

und die Lösung besteht darin, nicht zu verbieten, dass die Tab-Leiste nach oben verschoben wird, sondern dass der schwarze Bereich nicht angezeigt wird, wenn die Tab-Leiste nach oben verschoben wird

das Wichtigste ist, dass Sie Ihrem Ansichtscontroller eine Unteransicht hinzufügen, da diese die tiefste Unteransicht ist und der Rahmen dieser Unteransicht die Fenstergröße hat. Wenn sich die Registerkarte nach oben bewegt, wird diese Unteransicht anstelle des schwarzen Bereichs angezeigt

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

}

diese Methode bietet den Vorteil, dass Sie weder eine Unterklasse für die Tab-Leiste erstellen noch die Push-Methode des Navigationscontrollers überschreiben müssen

0
ximmyxiao