- 示例工程
- 移动开发
【免费下载链接】flutter-examples
[Examples] Simple basic isolated apps, for budding flutter devs.
本指南围绕 custom_home_drawer 示例工程的 iOS 启动画面资源目录展开,系统讲解 Flutter 工程中LaunchImage.imageset的作用、两种官方推荐的定制方式(直接替换图片文件、通过 Xcode 拖拽导入),并结合仓库内真实的Contents.json、LaunchScreen.storyboard、Info.plist等文件剖析从“资源”到“屏幕”的完整装配链路。读完本文,你将能够在自己的 Flutter iOS 工程中独立完成启动画面的替换与验证,并对 Android 端的对应机制有清晰对照。
关联文档与背景:iOS 启动画面是什么
本文的核心依据是 LaunchImage.imageset/README.md。这份文档简短但明确地定义了 iOS 启动画面资源的定制入口:通过替换LaunchImage.imageset目录中的图片文件,或借助 Xcode 的 Assets.xcassets 编辑器拖入新图片,即可更换 App 冷启动瞬间展示的画面。
在 Flutter 工程中,iOS 启动画面由原生侧承载:App 进程启动、Flutter 引擎尚未绘制第一帧之前,系统展示的是原生 Launch Screen;引擎首帧渲染完成后该画面被自动替换。因此,调整启动画面本质上是调整 iOS 原生资源,与 Dart 代码无关——这也是为什么定制入口位于ios/Runner/Assets.xcassets而非lib/目录的原因。
从本仓库结构可以看到,每个示例工程(如 custom_home_drawer)都自带一套完整的 iOS Runner 原生壳,其启动画面资源布局完全一致,本文所述方法对仓库内所有含ios/目录的示例同样适用。
原文档核心方法一:直接替换图片文件
文档给出的第一种定制方式最直接:将你自己的启动图片文件替换进LaunchImage.imageset目录。
当前仓库中该目录的实际内容为:
custom_home_drawer/ios/Runner/Assets.xcassets/LaunchImage.imageset/ ├── Contents.json # 资源清单(描述各缩放档位与文件名对应关系) ├── LaunchImage.png # 1x 基准图 ├── LaunchImage@2x.png # 2x 高清图 ├── LaunchImage@3x.png # 3x 超清图 └── README.md # 本文依据的说明文档注意:仓库中这三张LaunchImage*.png均为1×1 像素的占位图(每个仅 68 字节),是 Flutter 模板生成的空白启动图,实际效果为纯色背景。这意味着当前工程的启动画面尚未被定制,正好可以作为“替换练习”的起点。
替换时需要遵守的关键约定:
- 文件名必须与
Contents.json中声明的filename一一对应,即LaunchImage.png、LaunchImage@2x.png、LaunchImage@3x.png; - 三张图分别对应 1x、2x、3x 三种屏幕缩放档位,iPhone 各机型会按自身 scale 自动选择最合适的图;
- 若只替换其中一张而保留其余占位图,低/高分屏设备可能出现显示不一致,建议三档同步替换。
Contents.json:资源清单的字段含义
目录下的 Contents.json 是 Xcode 管理该 imageset 的元数据,完整内容如下:
{ "images" : [ { "idiom" : "universal", "filename" : "LaunchImage.png", "scale" : "1x" }, { "idiom" : "universal", "filename" : "LaunchImage@2x.png", "scale" : "2x" }, { "idiom" : "universal", "filename" : "LaunchImage@3x.png", "scale" : "3x" } ], "info" : { "version" : 1, "author" : "xcode" } }字段语义如下:
| 字段 | 取值 | 含义 |
|---|---|---|
images[].idiom | universal | 资源适用的设备类型,universal表示 iPhone / iPad 通用 |
images[].filename | 文件名 | 当前缩放档位对应的实际图片文件 |
images[].scale | 1x/2x/3x | 屏幕缩放因子,@2x、@3x后缀即由该字段约定 |
info.version | 1 | Assets 目录格式版本 |
info.author | xcode | 目录生成方标识 |
若你通过文本编辑器(而非 Xcode)直接替换图片,只要保持三个filename对应的文件同步更换,通常无需改动Contents.json;若你新增了其它档位或调整文件名,则需要同步更新该文件,否则 Xcode 会按清单找不到图片而报错。
原文档核心方法二:通过 Xcode 拖拽导入
文档给出的第二种方式适合可视化操作,原文命令与步骤为:
- 打开 Flutter 工程的 Xcode 工程:
open ios/Runner.xcworkspace - 在 Xcode 左侧的Project Navigator中选中
Runner/Assets.xcassets; - 展开
LaunchImage这一 imageset,把准备好的图片直接拖入对应的1x、2x、3x空位。
拖拽方式与直接替换文件的本质相同——Xcode 会把新图片写入LaunchImage.imageset目录并更新Contents.json的filename映射——但免去了手动对齐文件名的负担,是官方推荐的日常做法。注意应打开Runner.xcworkspace(工作区)而非Runner.xcodeproj,因为 Flutter 的 iOS 工程通常依赖 CocoaPods 生成的 workspace 才能完整构建。
从资源到屏幕:启动画面的装配链路
仅仅替换图片还不足以理解启动画面,下面以仓库内的真实文件还原这条装配链路。
1. Info.plist 声明启动画面
Info.plist 中声明了启动画面的入口:
<key>UILaunchStoryboardName</key> <string>LaunchScreen</string> <key>UIMainStoryboardFile</key> <string>Main</string>UILaunchStoryboardName指向名为LaunchScreen的故事板(即LaunchScreen.storyboard),系统冷启动时会加载它作为启动画面。
2. LaunchScreen.storyboard 引用图片资源
LaunchScreen.storyboard 是整个画面的布局定义。从源码可以看到它包含一个UIImageView,通过image="LaunchImage"引用 assets 中的同名图片资源:
<imageView opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" image="LaunchImage" ...> </imageView>关键点:
image="LaunchImage"直接对应LaunchImage.imageset这个资源集合名,名字必须与 imageset 目录名一致;contentMode="center"表示图片按原始尺寸居中显示,不做拉伸,因此超大或超小的图片不会被缩放适配,建议按目标尺寸准备;- 画面背景为白色(
backgroundColor的 RGB 均为 1),未放图片时启动画面即白屏; - 该 storyboard 的
resources段还记录了图片的设计尺寸(宽 168、高 185),这是 Flutter 模板为占位图声明的默认参考尺寸。
3. 工程文件登记资源
启动画面还必须在工程构建配置中登记。project.pbxproj 中既包含LaunchScreen.storyboard的PBXFileReference文件引用(如path = Base.lproj/LaunchScreen.storyboard),也将其加入了 Resources 构建阶段(LaunchScreen.storyboard in Resources),确保打包时资源被正确拷贝进 App 包。
由此可知,若你在工程中调整了启动画面相关文件名或 storyboard 名称,需要保证Info.plist 声明、storyboard 引用、pbxproj 登记三者一致,链路才能完整闭合。
实战步骤:给当前工程换上自定义启动画面
结合上文,替换启动画面的完整操作可以归纳为以下流程:
- 准备图片:制作三张 PNG(或与占位一致尺寸的横/竖构图),分辨率对应 1x / 2x / 3x,例如 320×568(1x)、640×1136(2x)、960×1704(3x)量级的常见 iPhone 尺寸;竖屏应用可只关注竖屏构图。
- 方式 A(命令行/文本):将三张图分别命名为
LaunchImage.png、LaunchImage@2x.png、LaunchImage@3x.png,复制到custom_home_drawer/ios/Runner/Assets.xcassets/LaunchImage.imageset/覆盖原占位文件,保持 Contents.json 不变。 - 方式 B(Xcode):执行
open ios/Runner.xcworkspace,在 Project Navigator 选择Runner/Assets.xcassets下的LaunchImage,将图片拖入对应档位;如需更换背景色,可在LaunchScreen.storyboard的 View 属性中调整背景色。 - 验证:运行
flutter run或flutter build ios,冷启动 App 观察启动画面是否替换;注意 iOS 模拟器与真机均会缓存启动画面,必要时可先卸载重装再验证。
与 Android 端启动画面的对照
同一工程的 Android 侧也实现了类似的“原生启动背景”机制,可作横向参考,两者共同点是在 Flutter 首帧前显示原生内容:
- Android 的启动背景由 launch_background.xml 定义,它是一个
layer-list,默认只有一层白色背景,并预留了插入 bitmap 的注释示例:<layer-list xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="@android:color/white" /> <!-- <item> <bitmap android:gravity="center" android:src="@mipmap/launch_image" /> </item> --> </layer-list> - 启动主题 styles.xml 中,
LaunchTheme通过android:windowBackground引用上述背景,并注明“在 Flutter 引擎绘制第一帧后自动移除”;values-night/styles.xml 则提供了深色模式下的Theme.Black.NoTitleBar变体,保证暗色环境下启动画面不突兀。
对比结论:iOS 用LaunchImage.imageset+LaunchScreen.storyboard承载启动画面,Android 用launch_background.xml+LaunchTheme承载;两者都在 Flutter 首帧渲染完成后自动让位,因此都属于“原生启动画面”而非 Flutter 层画面。
常见问题与注意事项
- 只替换了部分档位会怎样:如仅替换
@2x而 1x/3x 仍为占位图,不同屏幕密度的设备会显示不一致,务必三档同步替换。 - 图片比例与安全区:启动画面图片若包含品牌 Logo 或关键文案,应避开顶部状态栏、底部 Home 指示条等系统区域;
contentMode="center"下图片不会自动适配安全区。 - 修改后不生效:优先检查
Info.plist的UILaunchStoryboardName、storyboard 的image名与 imageset 目录名是否一致,三者必须都指向LaunchScreen/LaunchImage。 - 本仓库其它示例:如需观察启动画面在完整 App 中的呈现,可参考仓库内专门的 enabling_splash_screen 示例工程,其
lib/main.dart展示了启动后进入 Flutter 主页(Splash Screen Example)的典型流程,配合本文的 iOS 资源定制即可实现端到端的启动体验改造。
总结
flutter-examples 仓库中的 LaunchImage.imageset/README.md 虽然篇幅简短,却点出了 iOS 启动画面定制的两条核心路径:直接替换目录图片文件与通过 Xcode 拖拽导入。结合仓库内 Contents.json 的档位声明、LaunchScreen.storyboard 的图片引用、Info.plist 的入口声明以及 Android 侧 launch_background.xml 的对照实现,可以完整掌握 Flutter 工程“原生启动画面”的定制原理与实操方法,为打造专业的首屏体验打下基础。
- 示例工程
- 移动开发
【免费下载链接】flutter-examples
[Examples] Simple basic isolated apps, for budding flutter devs.
相关推荐
Flutter iOS 启动页(Launch Screen)资源定制指南:LaunchImage.imageset 解析
Flutter iOS 启动页(Launch Screen)资源定制指南:LaunchImage.imageset 解析 导读 :本文以 Flutter Not
示例工程移动开发自定义 Flutter iOS 启动屏(Launch Screen)资源:LaunchImage.imageset 实战指南
自定义 Flutter iOS 启动屏(Launch Screen)资源:LaunchImage.imageset 实战指南 本篇指南围绕 flutter ex
示例工程移动开发Flutter iOS 启动屏(Launch Screen)资源定制指南:以 Flutter-Notebook 的 LaunchImage.imageset 为例
Flutter iOS 启动屏(Launch Screen)资源定制指南:以 Flutter Notebook 的 LaunchImage.imageset 为
示例工程移动开发
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考