通过self.present从主视图控制器的启动屏幕无法正常显示(使用Swift)

f4t66c6m  于 2023-11-16  发布在  Swift
关注(0)|答案(1)|浏览(152)

我是一个完全的新手,在学习一本书的同时开始探索Xcode环境。我被如何在你打开一个应用程序时出现一个闪屏分散了注意力。内置的启动屏幕方法不会在屏幕上停留很长时间,所以我用Chat GPT来找出如何让它在屏幕上停留更长时间。它告诉我的是,只要出现第二个视图,就可以工作。但它就像是透明的,你可以看到下面的主视图。
我在默认情况下的ViewController中有以下代码:

  1. import UIKit
  2. class MainScreenController: UIViewController {
  3. override func viewDidLoad() {
  4. super.viewDidLoad()
  5. // Do any additional setup after loading the view
  6. }
  7. override func viewDidAppear(_ animated: Bool) {
  8. super.viewDidAppear(animated)
  9. let fakeLoadingView = FakeSplashScreen()
  10. self.present(fakeLoadingView, animated: true)
  11. }
  12. }
  13. class FakeSplashScreen: UIViewController {
  14. override func viewDidLoad() {
  15. super.viewDidLoad()
  16. print("This did load")
  17. DispatchQueue.main.asyncAfter(deadline: .now() + 2.0) { // Simulate a 2-second delay
  18. self.dismiss(animated: true) // Dismiss the fake loading view
  19. //Continue to your app's main interface
  20. print("I was dismissed")
  21. }
  22. }
  23. }

字符串
然后在“Main”情节提要中添加以下内容,其中只有一个标签:
x1c 0d1x的数据
然后这个作为启动画面:



当它运行时,它似乎工作-“这确实加载”和“我被解雇”打印,所以它正在运行,但闪屏在它消失前看起来像这样:



自定义类的闪屏viewcontroller被设置为FakeSplashScreen,除此之外什么都没改变。
有人能解释一下发生了什么事吗?我做错了什么?
谢谢

hmtdttj4

hmtdttj41#

第一个问题是,当你呈现一个视图控制器时,UIKit:

  • 覆盖屏幕的“调光”视图
  • 滑上新的控制器
  • 并缩小当前视图

使用您发布的代码,您的FakeSplashScreen没有内容.甚至根视图也没有背景颜色。
所以,如果这是你的“主”控制器:
x1c 0d1x的数据
你的FakeSplashScreen看起来像这样:



我们所看到的是变暗的视图和略微缩小的主视图。
如果你在FakeSplashScreen中只把这个加到viewDidLoad()上:

  1. view.backgroundColor = .systemYellow

字符串
它看起来像这样:



2秒后,黄色视图将“向下滑动”
有许多方法可以实现“启动画面”--这取决于您想要做的所有事情将决定最佳方法。
然而,一种方法是:

  • main控制器的viewDidLoad()
  • 加载FakeSplashScreen作为视图控制器
  • 将其视图添加为子视图
  • 将其约束为覆盖整个视图
  • 然后,仍然在控制器中,在viewDidAppear()
  • 开始两秒钟的延迟
  • “淡出”飞溅视图
  • 删除它
  • 删除子控制器

举个简单的例子:

  1. class ViewController: UIViewController {
  2. var splashVC: FakeSplashScreen!
  3. var splashView: UIView!
  4. override func viewDidLoad() {
  5. super.viewDidLoad()
  6. // whatever we're doing in Main Controller loading / preparing
  7. // ...
  8. // load FakeSplashScreen as a child controller
  9. self.splashVC = FakeSplashScreen()
  10. self.addChild(splashVC)
  11. // safely unwrap optional
  12. guard let v = splashVC.view else {
  13. fatalError("Check your code!")
  14. }
  15. // configure and add FakeSplashScreen's view to self.view
  16. v.translatesAutoresizingMaskIntoConstraints = false
  17. view.addSubview(v)
  18. NSLayoutConstraint.activate([
  19. v.topAnchor.constraint(equalTo: view.topAnchor),
  20. v.leadingAnchor.constraint(equalTo: view.leadingAnchor),
  21. v.trailingAnchor.constraint(equalTo: view.trailingAnchor),
  22. v.bottomAnchor.constraint(equalTo: view.bottomAnchor),
  23. ])
  24. splashVC.didMove(toParent: self)
  25. self.splashView = v
  26. }
  27. override func viewDidAppear(_ animated: Bool) {
  28. super.viewDidAppear(animated)
  29. DispatchQueue.main.asyncAfter(deadline: .now() + 2.0) { // Simulate a 2-second delay
  30. UIView.animate(withDuration: 0.3, animations: {
  31. self.splashView.alpha = 0.0
  32. }, completion: { _ in
  33. self.splashView.removeFromSuperview()
  34. self.splashVC.willMove(toParent: nil)
  35. self.splashVC.removeFromParent()
  36. })
  37. }
  38. }
  39. }
  1. class FakeSplashScreen: UIViewController {
  2. override func viewDidLoad() {
  3. super.viewDidLoad()
  4. view.backgroundColor = .systemYellow
  5. // setup / configure the "splash" screen
  6. }
  7. }

的数据
看起来有点像这样:

展开查看全部

相关问题