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

Joe*_*ina 4 uiviewcontroller uiview uiapplication uiapplicationdelegate ios

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

谢谢你的帮助,乔

Jes*_*sak 5

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

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

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

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