使用LaunchScreen.storyboard后,运行时显示老的图片

本文介绍了一个iOS应用启动页显示两个启动图的问题及其解决方法。问题出现在从使用launchImage切换到使用launchScreen.storyboard的过程中,在部分窄屏设备上出现老启动图未被正确替换的现象。最终通过清理Xcode的derivedData解决了该问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.问题描述

1.1.运行环境

Xcode版本:7.3.1
Simulator版本:8.4 & 9.3

1.2.背景

做一个项目APP时需要修改启动页,而老版本的启动页是通过launchImage在asset catalog中设置不同尺寸的启动图片。但产品化只提供了一套图片,所以改成了通过launchScreen.storyboard添加UIImageView加载图片,然后适配不同的屏幕。

1.3.问题

修改完毕之后,惊喜地发现6p,6sp上运行是对的。

在6p模拟器上的效果

但是在6s,6及以下的窄屏模拟器上有问题,显示在launchScreen上,似乎在新的界面上多了一份asset catalog中设置的老图片。

在6s模拟器上的效果

因为怀疑是工程中的老文件有冲突,所以就把asset catalog清空,但也没有效果。

2.解决方法

2.1.思路

后来尝试在launchScreen.storyboard中加载其他图片,6s中不会显示老的启动图。
尝试将启动页资源图片的名字由launchImage@2x.png launchImage@3x.png 改为 launchImage1.1@2x.png launchImage@3x.png 之后,6s模拟器上也不再显示老的启动图。

因此怀疑是工程中存在名为launchImage@2x.png 的图片,但是仔细查找后没有发现。

最后怀疑是在Xcode的缓存数据derivedData中存在老的图片,于是将Xcode中的derivedData清空,重新运行,效果正常。

2.2.结果

清空Xcode的缓存derivedData数据,重新运行即可。

3.原因

该工程的上个版本中在asset catalog中设置了5s的启动图,但未设置6p对应的启动图。

而在本次修改时,Xcode打包时因为某种原因未能用launchImage@2x.png 同步替换缓存中旧的同名文件,只新增了launchImage@3x.png 文件到缓存中。

所以在打包时就将旧的launchImage@2x.png 和 launchImage@3x.png 文件打包进了APP中,所以导致在6s / 6p中运行时,分别显示了不同的图片。

4.其他

推荐一个用来清理Xcode中derivedData的插件:
https://github.com/kattrali/deriveddata-exterminator

<think>我们正在解决“Xcode启动屏幕无法触发segues”的问题。首先需要明确:启动屏幕(Launch Screen)在应用生命周期中的位置和作用。 关键点: 1. 启动屏幕(LaunchScreen.storyboard)是应用启动显示的静态画面,仅用于展示,不能包含任何交互逻辑。 2. 启动屏幕在应用启动后立即显示,但会在应用准备好后立即消失,然后显示主界面(通常是Main.storyboard中的初始视图控制器)。 3. 启动屏幕上的任何控件(如按钮)都是不可交互的,因为它只是一个静态的启动图像(尽管使用storyboard来布局,但它不会运行任何代码)。 因此,问题可能是:用户误以为可以在启动屏幕上添加可交互的控件(如按钮)并触发segue跳转,但实际上这是不可能的。 解决方案: 1. 将启动屏幕视为纯静态展示,不要添加任何需要交互的控件。 2. 如果需要展示一个可交互的欢迎界面,应该将欢迎界面设计在应用的主storyboard中,作为应用的第一个视图控制器(而不是使用LaunchScreen.storyboard)。 具体步骤: 步骤1:移除启动屏幕上的交互控件 - 打开LaunchScreen.storyboard,确保上面没有按钮等可交互控件。如果有,删除它们。 步骤2:创建欢迎界面(如果需要) - 在Main.storyboard(或你的主storyboard)中,创建一个新的视图控制器作为欢迎界面(例如WelcomeViewController)。 - 在这个欢迎界面上添加按钮等控件,并设置segue跳转。 步骤3:设置应用的主界面 - 确保WelcomeViewController是初始视图控制器(Is Initial View Controller勾选)或者通过AppDelegate设置根视图控制器。 步骤4:处理启动流程 - 如果应用需要根据条件决定是否显示欢迎界面(例如首次启动),可以在AppDelegate中设置根视图控制器。 示例代码(在AppDelegate中): ```swift func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { // 设置窗口 window = UIWindow(frame: UIScreen.main.bounds) // 根据条件选择根视图控制器 let storyboard = UIStoryboard(name: "Main", bundle: nil) if UserDefaults.standard.bool(forKey: "hasSeenWelcome") { // 已经看过欢迎界面,跳转到主界面 let mainVC = storyboard.instantiateViewController(withIdentifier: "MainViewController") window?.rootViewController = mainVC } else { // 显示欢迎界面 let welcomeVC = storyboard.instantiateViewController(withIdentifier: "WelcomeViewController") window?.rootViewController = welcomeVC } window?.makeKeyAndVisible() return true } ``` 步骤5:在欢迎界面中触发segue - 在WelcomeViewController中,为按钮添加IBAction,使用performSegue或直接拖拽segue。 总结: - 启动屏幕(LaunchScreen.storyboard)不能触发segue,因为它不是交互界面。 - 将欢迎界面作为应用的首个交互界面放在主storyboard中,并设置适当的根视图控制器。 如果用户的问题不是由于试图在启动屏幕上触发segue,而是启动后主界面中的segue无法触发,那么可能是其他原因,例如: - 视图控制器类没有正确设置(检查Identity Inspector中的Class) - Segue标识符拼写错误 - 按钮或其他控件没有正确连接(检查IBAction和IBOutlet) - 视图控制器没有被正确初始化(例如,没有使用storyboard实例化) 但根据问题描述,我们聚焦于启动屏幕无法触发segues,所以最可能的原因就是试图在启动屏幕上添加交互。 引用说明: - 引用[1]提到在Interface Builder中连接控件,但这是针对普通视图控制器的,不适用于启动屏幕。 - 引用[2]提到设备开发配置,与当前问题无关。 因此,我们给出上述解决方案。</think>### 解决 Xcode 启动屏幕无法触发 Segues 的问题 启动屏幕(Launch Screen)在 iOS 应用中**无法触发任何 Segue 或交互操作**,这是由其设计机制决定的。以下是问题原因和解决方案: #### 🔍 问题原因 1. **启动屏幕的本质**: - 启动屏幕(`LaunchScreen.storyboard`)仅是一个**静态展示界面** - 它在应用启动显示,但**不会加载任何视图控制器类** - 系统将其渲染为静态图像展示,不执行任何代码[^1] 2. **技术限制**: ```swift // 启动屏幕不会实例化视图控制器 let vc = UIStoryboard(name: "LaunchScreen", bundle: nil).instantiateInitialViewController() print(vc?.isViewLoaded) // 始终返回 nil ``` #### ✅ 正确解决方案 1. **创建真实的欢迎界面**: - 在 `Main.storyboard` 中新建 `WelcomeViewController` - 将欢迎界面设置为初始视图控制器: ```swift // AppDelegate.swift func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { window?.rootViewController = UIStoryboard(name: "Main", bundle: nil).instantiateInitialViewController() return true } ``` 2. **在欢迎界面添加 Segue**: - 从欢迎界面的按钮拖拽 Segue 到目标控制器 - 设置 Segue 标识符(如 `"showMainApp"`) 3. **条件跳转逻辑**: ```swift // WelcomeViewController.swift override func viewDidAppear(_ animated: Bool) { super.viewDidAppear(animated) // 检查是否需要直接跳过欢迎页 if UserDefaults.standard.bool(forKey: "hasSeenWelcome") { performSegue(withIdentifier: "showMainApp", sender: nil) } } ``` 4. **启动屏幕配置原则**: - 仅包含静态元素(Logo/应用名称) - 保持与应用主界面相似的布局(避免闪屏感) - 文件大小尽量小(系统会缓存为图片) #### ⚠️ 常见错误排查 1. **错误:试图在启动屏幕添加按钮** - ✅ 修复:将按钮移到 `Main.storyboard` 的真实视图控制器中 2. **错误:给启动屏幕分配视图控制器类** - ✅ 修复:删除 `LaunchScreen.storyboard` 中的自定义类设置 3. **错误:启动屏幕元素未居中适配** - ✅ 修复:使用 Auto Layout 约束(不涉及代码执行) #### 💡 进阶技巧 若需要品牌化启动体验: ```swift // 在真实欢迎页模拟启动效果 func simulateLaunchScreen() { let launchImageView = UIImageView(frame: UIScreen.main.bounds) launchImageView.image = UIImage(named: "launch_logo") view.addSubview(launchImageView) UIView.animate(withDuration: 0.5, delay: 1.0, options: []) { launchImageView.alpha = 0 } completion: { _ in launchImageView.removeFromSuperview() self.performSegue(withIdentifier: "showMainApp", sender: nil) } } ``` > **关键结论**:启动屏幕仅用于视觉展示,所有交互逻辑必须在应用完成启动后,在 `Main.storyboard` 的真实视图控制器中实现[^1][^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值