ios - iOS 10 中添加到 UIApplication.shared.keyWindow 的 UIView 不可见

标签 ios swift uiview ios10 hoko

我一直在用这个问题撞墙,但自从我更新到 iOS 10.1 后,添加到 UIApplication.shared.keyWindow 的任何 View 似乎都没有渲染。它根本不可见。

我碰巧有一部运行 iOS 9.3.2 的测试手机,添加的 View 确实可见。

注意:我很长时间以来一直在使用它来显示“应用程序内通知”,而且效果非常好。

这是一段非常的简单代码,不会抛出任何错误。

let view = UIView(frame: CGRect(x: 0, y: 0, width: 500, height: 500))

view.backgroundColor = UIColor.red

let window = UIApplication.shared.keyWindow

window?.addSubview(view)

我检查了以下内容:

窗口不为零并且有一个完全有效的框架。 我添加的 UIView 也是如此,它确实出现在 View 层次结构中。 我也尝试过移动代码,将其放入 ViewDidAppear、ViewDidLayoutSubViews 等......但无济于事。

有什么想法吗?还有其他人面临同样的问题吗?

编辑: 看到下面的一些评论,我想我需要澄清一下:这段代码应该可以(如果我引用了 Apple 文档)。此外,该问题是 iOS 10 特有的。在 < iOS 10 的版本中,它可以完美运行。

所以我不是在寻找哪里应该调用这个调用,而是寻找什么可能已经改变在 iOS 10 中会带来这种行为。

谢谢

最佳答案

我完全是偶然找到了解决方案,而且很奇怪。 在我们的项目中,我们使用 HOKO Links 进行深度链接,我们遇到了 iOS 10 的错误:HOKO 正在“窃取”func application(_ application: UIApplication, open url: URL, sourceApplication: String?, annotation) 中的所有事件: 任何) -> Bool (Facebook, Google 登录...).

我们向 HOKO 的人提交了一个错误,并通过扫描他们的代码查找“大于 iOS9 的版本”设法找到了罪魁祸首,并遇到了以下方法:

- (void)requestDeferredDeeplink:(void (^)(NSString *))handler {

    BOOL isFirstRun = ![[HOKUtils     objectForKey:HOKDeferredDeeplinkingNotFirstRun] boolValue];

    if (isFirstRun) {
        self.handler = handler;

#if defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && __IPHONE_OS_VERSION_MAX_ALLOWED >= 90000
    if (HOKSystemVersionGreaterThanOrEqualTo(@"9.0")) {

        NSString *fingerprintURL = [NSString stringWithFormat:@"%@?uid=%@", [HOKNetworkOperation urlFromPath:HOKFingerprintMatchingPath], [HOKDevice device].uid];
        self.safariViewController = [[SFSafariViewController alloc] initWithURL:[NSURL URLWithString:fingerprintURL]];
        self.safariViewController.delegate = self;

        UIViewController *rootViewController = [[UIViewController alloc] init];

        UIWindow *window = [[UIWindow alloc] initWithFrame:CGRectZero];
        window.rootViewController = rootViewController;
        [window makeKeyAndVisible];
        window.alpha = 0;

        [rootViewController presentViewController:self.safariViewController animated:NO completion:nil];
    } else {
        [self requestDeferredDeeplink];
    }
#else
    [self requestDeferredDeeplink];
#endif
  }
}

解决方案是删除之间的所有代码 #if defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && __IPHONE_OS_VERSION_MAX_ALLOWED >= 90000#endif 并替换为 [self requestDeferredDeeplink];

我们还注意到 HOKO窗口 alpha 设置为 0 ...... THAT 是阻止添加到 keyWindowUIViews 可见的原因。然而,奇怪的是,它并没有影响应用程序的其余部分。

我怀疑其他人可能会遇到这个问题,但我把它留在这里留给后代。

关于ios - iOS 10 中添加到 UIApplication.shared.keyWindow 的 UIView 不可见,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40763013/

相关文章:

ios - 表格 View 单元格的外壳。 swift

ios - UITableView 添加 WebView 和 ImageView Cells

ios - xcode 6 未在 Storyboard 中显示 View

ios - 如何在 NSObject 类 : Swift 中添加动态行为

swift avfoundation AVCapturePhotoCaptureDelegate 捕获方法

iphone - 未调用 UIViewController 的 loadView

objective-c - UITableViewController init 与 initWithStyle

ios - 克服 iPhone 5 系列和 iPhone 4 系列之间的 CPU 功率差异。 iPhone优化

Swift - 图表框架 - 如何隐藏/显示线图?

iPhone UIView :Is it possible to enable userinteraction only on subviews?