app端无法靠纯js或css实现真正的横竖屏自由切换,必须分平台原生配置:ios在manifest.json配app-plus.distribute.ios.orientation为数组["landscape-primary","landscape-secondary"],android配app-plus.distribute.android.orientation为"landscape",且需云打包生效;pages.json的pageorientation和uni.setscreenorientation在app端基本无效,仅plus.screen.lockorientation在android部分机型有限可用。

App端无法靠纯JS或CSS实现真正的横竖屏自由切换——所谓“自由”,是指用户旋转设备时界面自动响应、触摸坐标准确、视频/Canvas正常渲染。这在uni-app里必须分平台处理,且多数场景下只能“伪自由”:用原生配置锁死方向 + 页面级视觉适配补位。
manifest.json必须配对iOS和Android的orientation字段
不配这个,后续所有JS调用都白搭。iOS和Android配置项互不兼容,不能混用:
- iOS需在
manifest.json的app-plus.distribute.ios.orientation下填数组:["landscape-primary", "landscape-secondary"];填"landscape"或单个值会被忽略 - Android对应位置是
app-plus.distribute.android.orientation,填字符串"landscape"即可(不区分主次) - 改完必须重新云打包或制作自定义基座——真机调试时点“运行到手机”不会生效
pages.json里的pageOrientation只对小程序/H5生效
App端完全无视该配置。你写pageOrientation: "auto"或"landscape"在pages.json的页面style里,等于没写:
- 小程序端(如
mp-weixin)支持,值为"landscape"即可 - H5端部分浏览器允许
screen.orientation.lock('landscape'),但失败静默,需加.catch降级提示 - App端调用
uni.setScreenOrientation在iOS真机基本无效,返回{ result: 'fail', errMsg: 'not supported' }
真正能动的只有plus.screen.lockOrientation(仅Android部分机型)
这是目前App端唯一可能动态切换的API,但限制极多:
- 仅Android有效,iOS系统级禁止运行时旋转,调用后既不报错也不生效
- 要求
targetSdkVersion ≥ 28,且Activity未在AndroidManifest.xml中硬编码android:screenOrientation - 必须在
onShow中调用(非onLoad或onReady),因用户切后台再回来时方向可能已变 - 返回值是Promise,但失败时resolve而非reject,务必检查
res.result === 'fail'
video组件横屏要关controls和enable-danmu
<video></video>在iOS上默认锁定竖屏,不是API问题,而是原生播放器接管了方向控制权:
- 关闭
controls和enable-danmu可解除原生层强干预,把控制权交还JS层 -
uni.setScreenOrientation必须放在onReady中调用,onLoad太早,native view还没创建 - 用户点击全屏按钮后,iOS会再次接管方向,需监听
@fullscreen-change事件,在进入全屏瞬间重置方向 - 退出前记得调用
uni.setScreenOrientation({ orientation: 'portrait' }),否则下次进页面仍保持横屏
最易被忽略的点:Canvas和uni.getSystemInfo返回的是物理方向尺寸,不是当前屏幕朝向的实际可用尺寸——横屏时直接用screenWidth/screenHeight会导致拉伸或裁剪。真正在意横竖屏自由切换的业务(比如直播、游戏),得靠原生插件或subNVue页面隔离方向逻辑,纯Vue页面做不到。











