真机App横屏必须修改原生配置:iOS需改Info.plist添加UISupportedInterfaceOrientations数组,Android需在AndroidManifest.xml各activity中设置android:screenOrientation="landscape",manifest.json仅作指令,不修改原生文件无效。
uni-app 实现横屏显示,不能只靠 js 或 css 控制——真机 app 端必须修改原生配置,否则所谓“横屏”只是视觉假象,触摸错位、canvas 拉伸、键盘异常全都会来。
manifest.json 配置只对 App 有效,H5 和小程序完全忽略
你在 manifest.json 的 "h5" 或 "mp-weixin" 字段里加 "orientation": "landscape",H5 页面照样能旋转,小程序也不认——这不是你配错了,是它本来就不支持。App 端才真正读这个字段。
正确写法是:在 "app-plus" → "distribute" → "ios" 和 "android" 下分别设:
- iOS:
"orientation": ["landscape-primary", "landscape-secondary"](必须是数组,填"landscape"会被无视) - Android:
"orientation": "landscape"(字符串即可)
改完不删 unpackage 目录、不重新云打包或重装自定义基座,真机上永远不生效。
iOS 必须手动改 Info.plist,Android 必须改 AndroidManifest.xml
manifest.json 只是“指令”,真正执行的是原生层。不碰这两个文件,等于没锁。
- iOS:打开
unpackage/res/ios/Info.plist,加这两段:<key>UISupportedInterfaceOrientations</key><array><string>UIInterfaceOrientationLandscapeLeft</string><string>UIInterfaceOrientationLandscapeRight</string></array>
- Android:打开
unpackage/res/android/AndroidManifest.xml,找到和所有你用到的 activity(比如 subNVue 页面对应的 activity),每个都加:android:screenOrientation="landscape"
漏掉任意一个 activity,对应页面就会退回到竖屏或旋转异常。
uni.setScreenOrientation 在 App 端基本不可信
文档说它能切方向,但实际:
- iOS 真机调用后静默失败,不报错也不生效,
{ result: 'fail', errMsg: '...' }里常是空字符串 - Android 要求
targetSdkVersion ≥ 28,且 activity 不能在AndroidManifest.xml里硬编码screenOrientation,否则直接被系统拦截 - 即使成功,也只在当前 activity 生效;跳转新页面后方向重置,不会继承
别把它当主力方案。想“首页竖屏 + 游戏页横屏”,唯一可靠路径是:把游戏页做成独立 activity(用 subNVue 或原生插件),并在其 manifest 条目里单独锁定 landscape。
pages.json 单页横屏仅对小程序有效,App 端无效
你在 pages.json 里给某个页面加:
"mp-weixin": { "pageOrientation": "landscape" }
这只能让微信小程序该页面横屏,App 端完全不读这个字段。App 要横屏,还是得走原生配置那套。
另外注意:pageOrientation 在小程序里虽能生效,但部分安卓机型导航栏会错位——得在 onLoad 里用 uni.getMenuButtonBoundingClientRect() 动态算高度补偏移。
最易被忽略的一点:iOS 模拟器默认禁用硬件旋转,Xcode 菜单栏要手动勾选 Hardware → Rotate Left/Right;真机调试前务必确认设备开启了“自动旋转”系统开关。











