优点,问题,向iOS应用添加另一个UIWindow的示例?


92

最近,我一直在想一个iOS应用程序只有一个UIWindow。创建另一个UIWindow并将其放置在屏幕上似乎不是问题。

我的问题有点含糊,但我对此感兴趣:

  • 如果用UIWindow其他方式无法做到的一秒钟,我可能会实现什么?
  • 使用多个UIWindow实例时会出什么问题?
  • 我已经看到人们使用2nd UIWindow来显示弹出窗口,例如iPhone上的视图。这是一个好方法吗?为什么?为什么不?
  • 还有其他例子,使另一个例子完全有意义UIWindow吗?

不是我想念什么。我从未觉得有必要创建另一个UIWindow实例,但是也许它可以做我不知道的惊人事情!:-)

我希望它可以帮助我解决此问题:我需要在当前显示的内容上方添加“封面视图”。如果已经存在一个或多个模态控制器,它也应该起作用。如果UIView在根控制器的视图中添加a ,则模态控制器位于顶部,弹出式控制器也位于顶部。如果我以模态方式显示封面视图,并且已经有一个模态控制器,则仅覆盖部分屏幕。


Answers:


26

A UIWindow可以浮在其他UI元素(例如系统键盘)上方。

解决您的最后一段:使用UIWindow与主窗口相同的框架制作一个。将其windowLevel属性设置为UIWindowLevelStatusBar。将其hidden属性设置为NO


嗯,好的。谢谢。我知道。关于我的问题,您能否详细介绍一下?您知道如何获取由makeKeyAndVisible添加的秒UIWindow的RID吗?
Krumelur 2011年

将第二个UIWindow的hidden属性设置为YES。
rob mayoff

谢谢。我通过使其成为关键且可见来显示窗口?我通过使另一个窗口可见并放置另一个窗口来隐藏它?如何像UIActionSheet这样的UIWindow做动画?
Krumelur 2011年

请注意这一点。如果位于!= UIWindowLevelNormal,则键盘将显示在<iOS7下方。
肖恩2014年

108

从Rob的答案开始,我玩了一些,并想为其他人写下一些笔记,以获取有关此主题的信息:

  • 添加另一个根本不是问题UIWindow。只需创建一个makeKeyAndVisible。做完了
  • 通过显示另一个窗口将其删除,然后释放不再需要的窗口。
  • “键”窗口接收所有键盘输入。
  • UIWindow 涵盖了所有内容,甚至包括模式,弹出窗口等。
  • UIWindow总是隐含肖像。它不旋转。您必须添加一个控制器作为新窗口的根控制器,并让其处理旋转。(就像主窗口一样)
  • 窗口的级别决定了它显示的“高度”。将其设置为UIWindowLevelStatusBar覆盖所有内容。设置其hidden属性为NO。
  • 第二个UIWindow可用于在屏幕上浮动所有视图。无需创建虚拟控制器即可将其嵌入到UIPopoverController
  • 在没有Popover控制器但您可能想模仿类似东西的iPhone上,它尤其有用。
  • 是的,它当然解决了我的问题:如果该应用程序退出激活,请在当前显示的内容上方添加一个覆盖窗口,以防止iOS捕获您应用程序当前内容的屏幕截图。

如果没有答案,我将没有勇气使用另一个UIWindow。也非常有帮助,因为第二个UIWindow不会自动旋转。
丹·阿布拉莫夫

1
很有启发性的帖子。但是,如果您辞职此窗口并使底层窗口的键可见,并且此底层窗口的rootViewController当前具有模式控制器,会发生什么情况?它将提供模态视图控制器回来吗?在我们的应用程序中发生的事情是rootViewController不是模态的...
Nava Carmon

@Krumelur很好。我有个疑问。也就是说,第二个UIWindow显示在所有当前视图的顶部。当用户单击第一个UIWindow中的视图上的一个按钮时,该按钮将显示另外一个viewcontroller。这第二个UIWindow将隐藏。如何使此UIWindow始终在整个应用程序中显示。
Easwaramoorthy K

1
我一直使用UIWindow来实现自定义样式的警报视图和iPhone Popover。它有助于始终使视图全屏显示,包含全屏视图并在内部嵌入另一个“内容”视图,以便外部视图可以捕获任何触摸事件(因此我可以添加漂亮的阴影并使其他内容变暗^^)
Martin Ullrich

3
应该注意的是,第二个窗口并不是仅仅为了可见而保留的(与常规视图由其超级视图保留的相反)。
里维拉2014年

0

以下是Apple文档,用于更好地理解UIWindow:https : //developer.apple.com/library/archive/documentation/WindowsViews/Conceptual/WindowAndScreenGuide/WindowScreenRolesinApp/WindowScreenRolesinApp.html

使用UIWindow的多个实例的一个很好的特定原因是,当您需要对应用程序屏幕进行视频录制时。您可能不希望在最终录制的视频中包括某些元素(录制按钮,录制状态等),因此可以将这些元素放在单独的UIWindow中。

实际上,如果您使用ReplayKit,则必须为这些排除的UI元素使用单独的UIWindow。此处提供更多信息:https : //medium.com/ar-tips-and-tricks/how-to-record-a-screen-capture-with-replaykit-whilst-hiding-the-hud-element-bedcca8e31e

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.