将 UIButton 放置在与 UITabBar 相同的空间中(隐藏时)

Posted

技术标签:

【中文标题】将 UIButton 放置在与 UITabBar 相同的空间中(隐藏时)【英文标题】:Placing a UIButton in the same space as UITabBar (When hidden) 【发布时间】:2014-07-28 07:27:38 【问题描述】:

我正在开发一个基于UITabBarController 的应用程序。在我的一个屏幕设计中,我需要隐藏标签栏(我使用UIViewsetHidden 方法)然后我在tabBar 通常所在的位置放置了一个UIView,并将UIButton 添加到UIView。但是,当点击按钮时,我没有得到任何响应。该按钮不接收任何触摸事件。

我查看了一些 SO 问题和解决方案的答案。然而,它们中的大多数都需要子类化。我已经尝试子类化和覆盖 HitTest 事件,但是即使在我的 UIButton 子类中也没有调用该方法。

我正在 ios 7.1 上进行开发。

谁能阐明这一点以及如何让按钮响应触摸事件?

编辑

我和@Geet 更仔细地研究了这个问题。似乎任何放置在与UITabBar 相同的空间中的东西都不会接收到触摸事件。作为一个测试,我用很少的代码创建了一个新项目来复制我原来的项目设置。

在示例应用程序中,我们将一个 UIViewController 嵌入到 UITabBarController 作为第一个选项卡。然后将 UIViewController 嵌入到 UINavigationController 中。从那里,我们将第二个UIViewController 压入堆栈。

点击顶部的“隐藏标签栏”按钮即可。隐藏标签栏。这暴露了已放置在storyboard 中的绿色UIView,以及连接到ViewControllers 实现文件的UIButton。此按钮根本不接收任何触摸事件。只要我将按钮移到 TabBar 通常占据的空间上方,按钮就会起作用。将其移回屏幕底部 - 按钮不再起作用。

Apple 似乎已禁止 UITabBar 下的所有触摸事件。我想知道有没有办法解决这个问题?

我试过了:

self.tabbar.userInteractionENabled = NO;

这也没有帮助。

也许有一种方法可以在UITabbarController 的子类中重写,当UITabBar 被隐藏时,该方法将允许在此规范中进行触摸?

如果有人想玩这个示例项目 - 它在我的 gitHub 上:

https://github.com/TanderZA/UIButton-in-UITabbar-Space

【问题讨论】:

你的意思是你没有使用UITabBarController的标签栏?作为 UIButton 的父视图的 UIView 是 UIImageView 的一种吗? 你能发布一些你的代码吗? 正确,我隐藏了 UITabBarController 的选项卡 ba。我在我的故事板上放置了一个 UIView,UITabBarController 的标签栏通常位于该位置。当我在 tabBar 旁边时 - 我可以看到我放在那里的 UIView。但是,我放置在该视图中的底部没有响应触摸。除非在其顶部边缘触摸按钮。这让我觉得这个 iOS 不允许触摸屏幕底部。一定有解决办法吗? @Geet 几乎没有任何代码。我所做的就是 self.tabbarController.tabBar.hidden = YES。然后我可以看到我在情节提要的 tabBar 空间后面放置的 UIView。然后我将视图中的 UIButton 连接到我的 viewController 文件。如果我将 UIView 向屏幕顶部移动几个点 - 按钮开始工作。 如果有人可以向我们解释这一点,我们将不胜感激。 【参考方案1】:

Tander 我终于弄明白了,按钮没有响应,因为它没有接收到我们的触摸事件,你看在我们的故事板中,视图没有连接到 viewController,因此当我以编程方式将按钮添加到视图时它永远不会响应,一条简单的线解决了这个问题

在函数中

- (IBAction)doneButton:(UIBarButtonItem *)sender

就这样做

- (IBAction)doneButton:(UIBarButtonItem *)sender

    /* Will hide or unhide the tabBar */

    self.tabBarController.tabBar.hidden=YES;
    [self.tabBarController setTabBarItem:nil];

    UIButton *butt=[UIButton buttonWithType:UIButtonTypeCustom];
    butt.backgroundColor=[UIColor redColor];
    butt.frame=CGRectMake(160, 530, 93, 40);
    [butt addTarget:self action:@selector(testButtonPressed:) forControlEvents:UIControlEventTouchUpInside];
    [self.tabBarController.view addSubview:butt];




self.tabBarController.view 是我们的罪魁祸首,没有让触摸事件通过,很高兴发现它

【讨论】:

这令人印象深刻。谢谢你弄清楚! :D。这为我要实施的其他解决方案节省了很多工作!【参考方案2】:

我自己最近遇到了这个问题,就我而言,向self.tabBarController.view 添加视图不是一种选择。

将 tabBar 设置为半透明(除了隐藏它)允许触摸通过。

[self.tabBarController.tabBar setTranslucent:YES];

【讨论】:

不错。我会尝试一下,看看它是否有效,因为我也想删除 UITabBar 中的子视图。 仍在使用我们的 iOS 9 GM 代码。 iOS 9 的新功能是,如果不将其设置为半透明,则会在隐藏的标签栏所在的位置获得一个很大的不透明空间,这实际上使问题变得显而易见(至于为什么触摸没有通过)。跨度> 【参考方案3】:

我最近遇到了这个问题,我们使用isHidden 隐藏了UITabBar,但是UIViewUITabBar 下的一个子视图控制器中的UITabBar 不会接收到命中事件。它在任何地方都接收到事件,但 UITabBar 过去是可见和定位的。

来回转动手机会使问题消失。我最终找到的解决方案是在将isHidden 设置为true 之后,您需要在UITabBarController 视图上调用setNeedsLayout

self.tabBarController.tabBar.isHidden = true;
self.tabBarController.view.setNeedsLayout();

【讨论】:

以上是关于将 UIButton 放置在与 UITabBar 相同的空间中(隐藏时)的主要内容,如果未能解决你的问题,请参考以下文章

您如何将 UIButton 保持在 UITabBar 的顶部(如 z-index)

添加UITabbar时UIButton不可点击

将 UITabBar 放置在 UITabBarController 中的屏幕顶部

带有类似于 uitabbar 的图标/文本的 uitoolbar

由于 UIButton segue,如何切换 UITabBars?

自定义颜色的 UITabBar 图标