2011-03-04 53 views
0

我有一个可用的选项卡栏应用程序。每个标签是一个UINavigationController,其根视图是某种UIViewController,通常是UITableViewController全屏UIView子类作为不消耗触摸事件的面纱

在应用程序中有一些情况下,我想显示一个全屏“面纱”,并显示有关正在发生的事情的消息,直到某个操作完成。关键是要吞噬任何接触操作开始的用户界面。

面纱是一个UIView子类。这个类有一个单例实例。显示时,我将其作为UITabBarController视图的子视图插入。该视图出现在整个用户界面上,包括标签栏。大!

这是问题所在。我可以点击标签和UI更改。我本来期望的是,我的面纱观只会吞噬一切。

我已经在我的面纱类中实现了各种触摸{开始|结束|移动|取消}方法(作为无所事事的方法),但触摸仍然由标签栏拾取,坦然地被任何对象无论我碰到什么。

我也尝试覆盖一些其他方法,包括nextResponder,hitTest:withEvent :,等,无济于事。

我在这一点上有点难住。我希望有人会有一些圣人的建议。 :-)

谢谢。

回答

3

修改框架类的视图层次结构是不安全的。你可以更好地将它添加为窗口本身的子视图。至于消费触摸,如果进行此更改不起作用,那么您还应该验证在视图上​​userInteractionEnabled设置为YES。您不必实际实施任何触摸相关的方法。

+0

@ Kevin-Ballard:谢谢你。所以我按照你的建议达到了同样的视觉效果:将面纱作为委托人窗口的子视图。而且,面纱的'userInteractionEnabled'标志被设置为YES。我评论了触控处理方法的空实现。这些触动继续传递到基本观点。任何其他想法? – 2011-03-04 20:44:14

+0

@MarkGranoff:我认为它也会失败,如果你留下null实现?你把它插在窗口的根部?我可以为你的行为考虑的最可能的原因是,如果一个超级视图有一个UIGestureRecognizer,但是如果你在窗口的根目录,那么情况并非如此。我唯一能想到的其他事情就是你的阿尔法。您是否在视图中设置了“alpha”属性?如果'alpha'为'0.05'或更少,触摸跳过视图。它应该设置为'1',你的视图应该没有背景色。 – 2011-03-04 20:48:39

+0

@ Kevin-Ballard:是的,有或没有空实现,相同的行为。没有使用UIGestureRecognizers,至少我没有明确表示。 alpha属性设置为0.65。所以我将它设置为1,并使用clearColor,以便我可以看到可能发生的情况。仍然失败。顺便说一句,这个视图是用这样的代码插入的[[myApp delegate] .window addSubview:[Veil theVeil]]'。这当然有效(我看到了面纱),我想不出以另一种方式“以正确的方式”。真是奇怪。 – 2011-03-04 20:58:21

1

我也有这个问题,并提出了一个hacky的解决方案。在您的自定义UIView类的init中,创建一个不可能命中的虚拟UIView,例如[[UIView alloc] initWithFrame:CGRectMake(-1, -1, 0, 0)]。或者实际上,我认为任何UIView不附加到窗口的作品。然后,在hitTest:withEvent:中,让它返回不在您感兴趣的区域中的每个点的虚拟视图。