0

在 TvOS 13 之前,TvOS 12 在未聚焦时使用自动隐藏标签栏。但在 TvOS 13 中,它使用了一个固定的标签栏,该标签栏始终在顶部可见。

固定的标签栏不符合我的应用要求,因为我需要在隐藏标签栏的情况下全屏显示我的标签内容。

无论如何我可以将标签栏改回以前的版本,这样它在不使用时总是隐藏起来,我可以随时向上滑动以显示标签栏菜单?

4

2 回答 2

1

不,你不能。但是,如果您有滚动视图,则可以将菜单连接到滚动视图,以便在您滚动滚动视图时菜单滚动菜单并在您向上滚动时重新出现。

检查tabBarObservedScrollView https://developer.apple.com/documentation/uikit/uiviewcontroller/3152928-tabbarobservedscrollview

于 2020-07-15T07:02:34.180 回答
0

你可以很容易地实现它。这个想法是:

  1. 创建一个将 TabBar 动画显示在屏幕外的方法
  2. 当焦点离开您的 TabBar 时启动此动画

这是 UITabBarController 的代码:

// Animate UITabBar out of screen bounds
@implementation YourTabBarController {
    BOOL _isHidden;
    CGFloat _originalY;
}

-(void)setTabBarHidden:(BOOL)hidden {
    if (hidden == _isHidden) {
        return;
    }
    
    CGRect frame = self.tabBar.frame;
    CGFloat alpha;
    if (hidden) {
        // Calculate original distance from top of the window
        _originalY = [self.tabBar convertPoint:frame.origin toView:nil].y;
        frame.origin.y -= (frame.size.height + _originalY);
        // ! Important not to use 0, otherwise your TabBar will be
        // removed from focus engine and will not re-appear.
        // focus engine.
        alpha = 0.1;
    } else {
        frame.origin.y += (frame.size.height + _originalY);
        alpha = 1;
    }
    
    [UIView animateWithDuration:0.3 animations:^{
        self.tabBar.frame = frame;
        self.tabBar.alpha = alpha;
    }];
    
    _isHidden = hidden;
}

-(void)didUpdateFocusInContext:(UIFocusUpdateContext *)context 
      withAnimationCoordinator:(UIFocusAnimationCoordinator *)coordinator {
    if (context) {
        id<UIFocusItem> item = [context nextFocusedItem];
        
        if (item != nil && [item respondsToSelector:@selector(isDescendantOfView:)]) {
            BOOL isTabBarFocused = [(UIView*)item isDescendantOfView:self.tabBar];
            
            [self setTabBarHidden:!isTabBarFocused];
        }
    }
}
于 2020-08-06T15:27:42.350 回答