将 UIButton 放置在与 UITabBar 相同的空间中(隐藏时)
Posted
技术标签:
【中文标题】将 UIButton 放置在与 UITabBar 相同的空间中(隐藏时)【英文标题】:Placing a UIButton in the same space as UITabBar (When hidden) 【发布时间】:2014-07-28 07:27:38 【问题描述】:我正在开发一个基于UITabBarController
的应用程序。在我的一个屏幕设计中,我需要隐藏标签栏(我使用UIView
的setHidden
方法)然后我在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
,但是UIView
在UITabBar
下的一个子视图控制器中的UITabBar
不会接收到命中事件。它在任何地方都接收到事件,但 UITabBar
过去是可见和定位的。
来回转动手机会使问题消失。我最终找到的解决方案是在将isHidden
设置为true
之后,您需要在UITabBarController
视图上调用setNeedsLayout
:
self.tabBarController.tabBar.isHidden = true;
self.tabBarController.view.setNeedsLayout();
【讨论】:
以上是关于将 UIButton 放置在与 UITabBar 相同的空间中(隐藏时)的主要内容,如果未能解决你的问题,请参考以下文章
您如何将 UIButton 保持在 UITabBar 的顶部(如 z-index)
将 UITabBar 放置在 UITabBarController 中的屏幕顶部
带有类似于 uitabbar 的图标/文本的 uitoolbar