无法单击 "under" 隐藏的 TabBar

Unable to click "under" a hidden TabBar

我这样隐藏标签栏:

self.tabBarController.tabBar.hidden = YES;

因为现在在它曾经站立的地方有一个黑条,所以我拉伸了视图,它是一个 UIWebView 在顶部(或者在下面?)是空的 space。 UIWebViewUIViewController 中。我这样做有一个约束,默认情况下是这样的:

约束代码:

if(self.tabBarController.tabBar.hidden){
    self.webviewBottomConstrain.constant = -self.tabBarController.tabBar.frame.size.height;
}else{
    self.webviewBottomConstrain.constant = 0;
}

但是,如果我在 TabBar 所在的位置点击设备,它将不会执行。就好像标签栏的大小那里有什么看不见的东西。我也试过用 this thread sugests 的方式隐藏它。还是一样的结果。

更新: 似乎当您点击不可见的标签栏时,标签栏会识别点击,而不是标签栏下可见的视图

您通过将其隐藏 属性 设置为 NO 来隐藏您的 tabBar?尝试将其设置为 YES。除非我误解了您要做什么,否则您的标签栏似乎没有被该代码隐藏。

我要检查的另一件事是查看是否为 Web 视图选中了“启用用户交互”。如果不是,则看起来好像有某种看不见的东西阻止您与您的视图进行交互。

好吧,我正在使用非常丑陋的 hack 来解决这个问题。我现在用另一种方式隐藏标签栏:

if (shouldShow) {
    self.hidesBottomBarWhenPushed = NO;
    UIViewController *someView = [[UIViewController alloc] init];
    [self.navigationController pushViewController:someView animated:NO];
    [self.navigationController popToViewController:self animated:NO];

} else if (shouldHide) {
    self.hidesBottomBarWhenPushed = YES;
    self.tabBarController.hidesBottomBarWhenPushed = YES;
    self.navigationController.hidesBottomBarWhenPushed = YES;
    UIViewController *someView = [[UIViewController alloc] init];
    [self.navigationController pushViewController:someView animated:NO];
    [self.navigationController popToViewController:self animated:NO];
}

我确实需要那个随机视图,因为我无法将视图自身推送。

self.extendedLayoutIncludesOpaqueBars = 是; 这会解决你的问题

通过将标签栏移到屏幕外来隐藏标签栏时,我遇到了同样的问题。我的自定义 UITabBarViewController 拦截了标签栏腾出的区域中的触摸事件,因此我没有更改标签栏的框架以将标签栏移出屏幕,而是扩展了标签栏视图控制器的高度,以便标签栏仍然移到了屏幕外,但选项卡栏上方的子视图现在填充了 space。这允许子视图接收触摸。

正如您在视图层次工具中看到的那样,UITabBar 并没有直接阻止您的点击,但是您当前的视图控制器的视图高度不是全屏:

因此,点击没有响应,因为您手指的 y 位置高于视图的 maxY

像这样的代码(在您的 UITabBarController 中)将根据标签栏的可见性扩展您的视图高度,并且所有点击事件都将正常工作。

func updateTabBarAppearanceWithDegree(_ degree: CGFloat) {
    let screenHeight = UIScreen.main.bounds.size.height
    let tabBarHeight = self.tabBar.frame.size.height

    self.tabBar.frame.origin.y = screenHeight - tabBarHeight * degree
    self.tabBar.alpha = degree

    let currentNavigation = self.selectedViewController as? UINavigationController
    if let currentTopView = currentNavigation?.viewControllers.last?.view {
        currentTopView.frame.size.height = self.tabBar.frame.origin.y
    }
}