保持UIView或UIViewController在所有其他人之上

时间:2013-01-10 00:34:07

标签: ios uiview uiviewcontroller uiapplicationdelegate uiapplication

我将UIApplication子类化为拦截并显示TouchDisplay视图中的触摸。我想扩展Application,Window,Delegate或Main ViewController,以使我的TouchDisplay视图保持在所有其他视图之上。随着我和其他大多数应用程序的工作,视图和控制器会一直添加和删除。我认为正确的答案将能够处理这些添加和删除,并保持TouchDisplay视图在顶部。

感谢您的帮助, 乔

2 个答案:

答案 0 :(得分:5)

以下是您可以采取的一些方法:

  1. 如果您的目标是 iOS 5+和仅限iPad ,您可以创建一个顶级视图控制器,其中包含两个包含视图控制器。第一个是“TouchDisplay”视图的视图控制器。第二个是应用程序的普通根视图控制器。 (即您现有的主视图控制器;您需要在此视图控制器上将 definesPresentationContext 设置为YES)由于您正在编写容器视图控制器,因此您可以根据需要订购这两个子视图。有一个WWDC 2011 Talk on view controller containment详细介绍了这一点。这是最“正确”的方法恕我直言,因为它为您的TouchDisplay视图提供了一个视图控制器,处理旋转并且通常与其他人一起玩得很好。 (这仅适用于iPad,因为在iPhone上,新的模态视图始终覆盖整个屏幕。)

  2. 更直接的方法是将TouchView添加到现有的顶级UIWindow作为addSubview:的子视图。大多数应用程序实际上并没有删除顶级视图控制器或添加新的顶级视图控制器;他们只是从中呈现其他视图控制器。您在顶级窗口中添加的视图将保持在这些视图之上。当然,您的应用可能不遵循此规则,在这种情况下,您可以尝试选项#3。这有旋转陷阱(当设备旋转时你的视图不会自动旋转,所以你需要自己动手。)如果你有问题,你也可以强制你的视图回到顶部,比如1秒计时器用其他东西覆盖它。这也不如选项#1好,因为你没有得到UIViewController,只是一个UIView。

  3. 最极端的方法是您可以创建另一个UIWindow并为其提供更高的窗口级别,例如UIWindowLevelAlert并将TouchDisplay视图放入其中。然后,您可以使窗口背景透明,并且它将保持在正常应用内容之上。这里有很多陷阱,特别是关于自动旋转以及哪个窗口是关键窗口(这就是为什么你应该使用#1或#2代替你的原因。)

答案 1 :(得分:2)

过了一段时间我才能让我的应用运行起来。我制作了一个易于使用的叠加层,显示了对现有应用程序的触摸反馈。

您可以在此处下载项目: https://github.com/megaplow/FingerTracks/tree/master/FingerTracks

Sample Image

快乐的编码, 乔