我一直在用这个问题撞墙,但自从我更新到 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 是阻止添加到 keyWindow
的 UIViews
可见的原因。然而,奇怪的是,它并没有影响应用程序的其余部分。
我怀疑其他人可能会遇到这个问题,但我把它留在这里留给后代。
关于ios - iOS 10 中添加到 UIApplication.shared.keyWindow 的 UIView 不可见,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40763013/