swift - SceneDelegate中Launch和第一个ViewController之间黑屏闪烁
问题描述
我正在使用 SceneDelegate.swift 来决定使用此代码显示哪个 ViewController:
guard let windowScene = (scene as? UIWindowScene) else { return }
if Auth.auth().currentUser != nil {
AuthenticationService.automaticSignIn(onSuccess: {
let window = UIWindow(windowScene: windowScene)
self.window = window
let mainstoryboard:UIStoryboard = UIStoryboard(name: "Login", bundle: nil)
let newViewcontroller:UIViewController = mainstoryboard.instantiateViewController(withIdentifier: "TabBarControllerID") as! TabBarController
window.rootViewController = newViewcontroller
window.makeKeyAndVisible()
}, onError: {
let window = UIWindow(windowScene: windowScene)
self.window = window
let mainstoryboard:UIStoryboard = UIStoryboard(name: "Login", bundle: nil)
let newViewcontroller:UIViewController = mainstoryboard.instantiateViewController(withIdentifier: "LoginViewControllerID") as! LoginViewController
window.rootViewController = newViewcontroller
window.makeKeyAndVisible()
})
} else {
let window = UIWindow(windowScene: windowScene)
self.window = window
let mainstoryboard:UIStoryboard = UIStoryboard(name: "Login", bundle: nil)
let newViewcontroller:UIViewController = mainstoryboard.instantiateViewController(withIdentifier: "LoginViewControllerID") as! LoginViewController
window.rootViewController = newViewcontroller
window.makeKeyAndVisible()
}
}
在过渡之间,会出现一个黑屏(在我的 .gif 中大约 0.2 秒),具体取决于加载时间。对不起质量差和持续时间短,但你会看到它:
这个黑屏是哪里来的?
解决方案
该问题似乎是由启动故事板和可见窗口之间的演示文稿中的“间隙”引起的。appleIDProvider 是异步的。
一种解决方法而不是修复方法是呈现一个临时视图(与您的启动故事板具有相同的颜色或内容)并在授权完成后替换它;
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
guard let windowScene = scene as? UIWindowScene else { return }
let window = UIWindow(windowScene: windowScene)
window.rootViewController = UIHostingController(rootView: TempView())
self.window = window
window.makeKeyAndVisible()
let user = User.shared
let appleIDProvider = ASAuthorizationAppleIDProvider()
appleIDProvider.getCredentialState(forUserID: user.id) { (credentialState, error) in
switch credentialState {
case .authorized:
DispatchQueue.main.async {
user.authenticated = true
window.rootViewController = UIHostingController(rootView: HomeView(showAlert: false, showSendview: false, showAccountview: false))
}
default:
DispatchQueue.main.async {
user.authenticated = false
window.rootViewController = UIHostingController(rootView: SignInView().environment(\.window, window))
}
}
}
}
推荐阅读
- arrays - PineScript v5:array.concat(id1, id2) 与字符串反向 id2
- .net - 导航到 Blazor 服务器登录页面不工作
- ios - SwiftUI | 有没有办法动态设置 MKCoordinateSpan 以显示注释和 userLocation?
- python - 有没有办法扫描文档并将特定信息复制到 word 模板中?
- java - 在 Android 上的 TabLayout 中更改一个选项卡的大小
- javascript - Angular 12 - 使用 Observable 在数组中显示数据
- reactjs - React 上下文与 Redux
- flutter - 如何在颤动中为文本编辑器应用程序存储数据
- google-cloud-platform - 无法在 GCP 虚拟机内创建 TPU
- html - JetBrains WebStorm Jest 遇到了意外的令牌