
安卓端启动封面图拉伸,不是图片分辨率高就能解决的;iOS端启动图变形,也不是简单换张图就行。根本原因是两端原生渲染机制不同,必须分平台处理。
Android 启动图必须用 .9.png,不能只放 PNG
直接把 1080×1920 的 PNG 放进 resources/android/splash,在中低端 Android 设备上大概率拉伸——因为系统默认整图等比缩放,不识别内容安全区。
- 必须用
draw9patch.bat(Android SDK 自带)或在线工具(如https://romannurik.github.io/AndroidAssetStudio/nine-patches.html)生成.9.png - 上下黑线定义水平可拉伸区域,左右黑线定义垂直可拉伸区域;右下角黑框必须圈出 logo / 文字所在区域,否则会被压缩
- 原始图不能带透明边距或白边,否则 9.png 的拉伸逻辑会把空白当内容一起拉
-
manifest.json中"display": "portrait"必须和图的实际方向一致;横屏设备要额外提供横版.9.png并设为"display": "landscape"
iOS 启动图要用 Assets.xcassets,别手动生成 PNG
iOS 不认单独 PNG 文件,也不支持 .9.png。直接丢图进 resources/ios/splash 目录,打包后会被忽略或强制拉伸。
- 必须用 Xcode 打开
nativeResources/ios/Assets.xcassets/LaunchImage.launchimage,按尺寸规范填入各倍率图(@1x、@2x、@3x) - 注意 LaunchScreen.storyboard 是另一套机制,UniApp 默认不走 storyboard,除非你手动替换原生工程
- 如果 App 审核被拒说“启动图不符合规范”,90% 是尺寸不对或未覆盖所有机型分辨率,尤其注意 iPhone SE(2nd)、iPhone 14 Pro Max 等边界尺寸
App 端 <image> 组件不拉伸的关键是 mode + 容器控制
页面内图片和启动图是两回事:启动图是原生层,<image> 是 WebView 层。但很多人误以为改 mode 就能统一解决,结果 H5 正常、小程序留黑边、App 端照旧拉伸。
- App 端优先用
mode="widthFix"+ 固定容器宽高 +flex: 1布局,避免高度塌陷触发 x5 内核强制缩放 - H5 可加条件编译
#ifdef H5使用object-fit: contain,但 App 端无效 - 微信小程序若容器高度固定(如
height: 400rpx),mode="aspectFit"必然留白;此时改用mode="scaleToFill"+overflow: hidden裁剪更可控
alwaysShowBeforeRender 配置不当会导致“闪白屏”假性拉伸
启动图没拉伸,但首页一出来就白一下,用户感知就是“图变了形”。这不是图片问题,而是关闭时机错乱。
- 保持
"alwaysShowBeforeRender": true(默认),确保首页 Vue 渲染完成再关启动图 - 如果设为
false,首页 JS 加载完就关,DOM 还没挂载,必然闪白屏——尤其在低端 Android 上更明显 - 需要手动控制关闭(比如广告页倒计时)时,必须同时设
"alwaysShowBeforeRender": false, "autoclose": false,并在代码里调用plus.navigator.closeSplashscreen()
真正难的不是做一张图,而是让同一套配置在华为鸿蒙、小米 MIUI、iOS 17+ 上都表现一致。.9.png 的黑线位置、Assets.xcassets 的尺寸命名、mode 在不同端的兼容性,任何一个环节偏差都会导致拉伸——而且往往只在某几款机型上复现,调试成本极高。


















