You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Swift中主控制器present自定义启动屏显示异常求助

问题

我是编程新手,正在探索Xcode环境。系统默认Launch Screen停留时间太短,我尝试用代码实现一个停留更久的自定义启动屏,代码能正常打印日志,但弹出的自定义启动屏是透明的,能看到下方主视图。

代码如下:

import UIKit

class MainScreenController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view
        }

    override func viewDidAppear(_ animated: Bool) {
            super.viewDidAppear(animated)
            
            let fakeLoadingView = FakeSplashScreen()
            self.present(fakeLoadingView, animated: true)
        }
    
}

class FakeSplashScreen: UIViewController {
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        print("This did load")
        
        DispatchQueue.main.asyncAfter(deadline: .now() + 2.0) { // Simulate a 2-second delay
            self.dismiss(animated: true) // Dismiss the fake loading view
            //Continue to your app's main interface
            
        print("I was dismissed")
            
        }
        
   }
    
}

主故事板仅含一个标签,自定义启动屏的视图控制器已设置自定义类为FakeSplashScreen,其余未修改。

问题原因和解决方法

原因

你通过let fakeLoadingView = FakeSplashScreen()直接初始化控制器时,创建的是一个空的UIViewController实例,并没有关联你在故事板中配置的那个视图控制器。这个空实例的view默认是透明的,所以会透出下方的主视图。

解决方法

有两种可行方案:

方案一:从故事板加载配置好的视图控制器

  1. 打开故事板,选中FakeSplashScreen对应的视图控制器,在右侧Identity Inspector(身份检查器)中设置Storyboard ID为FakeSplashScreen(名称可自定义,保持代码与设置一致即可)。
  2. 修改MainScreenController中viewDidAppear的代码:
override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)
    
    // 通过Storyboard ID从故事板加载对应的控制器
    if let fakeLoadingView = storyboard?.instantiateViewController(withIdentifier: "FakeSplashScreen") as? FakeSplashScreen {
        self.present(fakeLoadingView, animated: true)
    }
}

这样就能加载到你在故事板中配置好的启动屏视图,透明问题自然解决。

方案二:直接在代码中设置启动屏背景色

如果不需要故事板中的布局,只想快速解决透明问题,可以在FakeSplashScreen的viewDidLoad方法中给view设置背景色:

class FakeSplashScreen: UIViewController {
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        view.backgroundColor = .white // 设置为你需要的背景色,比如和系统启动屏一致的颜色
        print("This did load")
        
        DispatchQueue.main.asyncAfter(deadline: .now() + 2.0) {
            self.dismiss(animated: true)
            print("I was dismissed")
        }
    }
}

内容的提问来源于stack exchange,提问作者mickeyt

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 13:12:45