【问题标题】:keyWindow does not always return a UIWindowkeyWindow 并不总是返回 UIWindow
【发布时间】:2014-10-30 10:28:45
【问题描述】:

我一直在使用[[UIApplication sharedApplication] keyWindow]UIView 的形式获得屏幕的可见视图。然后我将该视图转换为UIImage 以使用。这很好用,除非我同时显示UIAlertView。在这种情况下,keyWindow 不会像通常那样返回 UIWindow,而是返回 UIModalItemHostingWindow,并且在将该视图转换为图像后,它只是一个纯黑色的屏幕截图。

现在文档说keyWindow“在最近发送 makeKeyAndVisible 消息的 windows 数组中保存 UIWindow 对象。”

这个UIModalItemHostingWindow 一定是由于我正在呈现的模式警报,也许keyWindow 正在返回该视图而不是整个屏幕。

我的问题是,我怎样才能始终保证我得到一个准确表示屏幕上所有可见内容的UIView?看来keyWindow 不是一个好的解决方案。一种解决方法是延迟我抛出的所有可能的警报,但如果可能的话,我想找到一个更好的解决方案

【问题讨论】:

  • 你的屏幕上有rootviewcontroller吗??
  • 根视图控制器是标签栏控制器,当我尝试捕获图像时,它仍然在屏幕上可见。

标签: ios objective-c uiview uiwindow keywindow


【解决方案1】:

使用[[[UIApplication sharedApplication] delegate] window]

而不是[[UIApplication sharedApplication] keyWindow]

这保证您获得UIWindow,这是应用程序的最终根视图。

【讨论】:

    【解决方案2】:

    以相反的顺序遍历所有窗口(只是为了减少迭代)并检查窗口的类是否严格UIWindow

    for (UIWindow *window in [[UIApplication sharedApplication].windows reverseObjectEnumerator]) {
        if ([window class] == [UIWindow class]) {
            // do whatever you want with the window object
            break;
        }
    }
    

    【讨论】:

    • 感谢您的建议!由于某种原因,调用这段代码时,windows数组中实际上只有一个窗口。
    • 即使警报可见?是UIModalItemHostingWindow类型的窗口吗?
    • 是的。从技术上讲,UIModalItemHostingWindowUIWindow,所以当我登录[window class] 时,它会打印UIWindow,但在调试器中你可以看到它是UIModalItemHostingWindow,而它应该只是UIWindow,就像没有警报时一样在屏幕上。
    • 我可以通过延迟警报呈现来解决此问题。如果可能的话,我想找到一个更好的解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-27
    • 2018-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多