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默认是透明的,所以会透出下方的主视图。
解决方法
有两种可行方案:
方案一:从故事板加载配置好的视图控制器
- 打开故事板,选中
FakeSplashScreen对应的视图控制器,在右侧Identity Inspector(身份检查器)中设置Storyboard ID为FakeSplashScreen(名称可自定义,保持代码与设置一致即可)。 - 修改
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
相关产品推荐
相关产品推荐

