在 TvOS 13 之前,TvOS 12 在未聚焦时使用自动隐藏标签栏。但在 TvOS 13 中,它使用了一个固定的标签栏,该标签栏始终在顶部可见。
固定的标签栏不符合我的应用要求,因为我需要在隐藏标签栏的情况下全屏显示我的标签内容。
无论如何我可以将标签栏改回以前的版本,这样它在不使用时总是隐藏起来,我可以随时向上滑动以显示标签栏菜单?
不,你不能。但是,如果您有滚动视图,则可以将菜单连接到滚动视图,以便在您滚动滚动视图时菜单滚动菜单并在您向上滚动时重新出现。
检查tabBarObservedScrollView
https://developer.apple.com/documentation/uikit/uiviewcontroller/3152928-tabbarobservedscrollview
你可以很容易地实现它。这个想法是:
这是 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];
}
}
}