保持一个UIView或UIViewController在所有其他视图之上

4
我正在创建一个继承UIApplication的类,用于拦截和显示TouchDisplay view中的触摸事件。我希望扩展应用程序、窗口、委托或主视图控制器,以便将TouchDisplay view保持在所有其他视图的顶部。由于我的应用程序和大多数其他应用程序都是这样工作的,视图和控制器一直在添加和删除。我认为正确的答案将能够处理这些添加和删除,并仍然将TouchDisplay view保持在顶部。
感谢您的帮助, Joe

不确定是否有帮助,但是UIView有像[self.view insertSubview:view below/aboveView:anotherView];这样的方法。 - Snowman
2个回答

6
以下是几种可能的方法:
  1. 如果你的目标是 iOS 5+ 和仅限iPad,你可以创建一个顶级视图控制器,其中包含两个子视图控制器。第一个子视图控制器是 "TouchDisplay" 视图的控制器。第二个子视图控制器是应用程序的正常根视图控制器。(即你现有的主视图控制器;你需要在这个视图控制器上设置 definesPresentationContext 为 YES) 因为你正在编写容器视图控制器,所以可以按照自己的喜好排序这两个子视图。有一篇WWDC 2011 Talk on view controller containment详细介绍了这一点。这是最 "正确" 的方法,因为它为你的 TouchDisplay 视图提供了一个视图控制器,处理旋转并与其他视图控制器和谐相处。(这只适用于iPad,因为在iPhone上,新的模态视图总是覆盖整个屏幕。)

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

  3. 最极端的方法是创建另一个 UIWindow,并给它更高的窗口级别,例如 UIWindowLevelAlert,然后将你的 TouchDisplay 视图放在其中。然后可以将窗口背景设置为透明,它将保持在正常应用程序内容的上方。这里有很多注意事项,特别是关于自动旋转和哪个窗口是 keyWindow (这就是为什么如果可以,应该使用 #1 或 #2 而不是 #3 的原因)。


3

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接