uni-app iOS下调用摄像头时调整屏幕为横向 显示画面逆转90度

发布于 1周前 作者 ionicwang 来自 Uni-App

uni-app iOS下调用摄像头时调整屏幕为横向 显示画面逆转90度

开发环境 版本号 项目创建方式
Mac macOS Ventura 13.5 HBuilderX

产品分类:uniapp/App

PC开发环境操作系统:Mac

HBuilderX类型:正式

HBuilderX版本号:3.99

手机系统:iOS

手机系统版本号:iOS 17

手机厂商:苹果

手机机型:iPad Air

页面类型:nvue

vue版本:vue2

打包方式:离线

项目创建方式:HBuilderX

示例代码:

export default {
data() {
return {
src: ''
}
},
onLoad(options) {
// #ifdef APP-PLUS
// 强制横屏
plus.screen.lockOrientation('landscape')
// 保持屏幕常亮
uni.setKeepScreenOn({
keepScreenOn: true
});
// 保持全屏,无状态栏
plus.navigator.setFullscreen(true)
// 隐藏手机底部导航按键
plus.navigator.hideSystemNavigation()
// #endif
},
onReady() {
// 注意:需要在onReady中 或 onLoad 延时
this.context = uni.createLivePusherContext("livePusher", this);
this.startPreview()
},
onUnload() {
// #ifdef APP-PLUS
// 恢复竖屏
plus.screen.lockOrientation('portrait-primary');
// 关闭保持屏幕常亮
uni.setKeepScreenOn({
keepScreenOn: false
})
// 恢复状态栏
plus.navigator.setFullscreen(false)
// 显示手机底部导航按键
plus.navigator.showSystemNavigation()
// #endif
},
methods: {
startPreview: function() {
this.context.startPreview({
success: (a) => {
console.log("livePusher.startPreview:" + JSON.stringify(a));
}
});
console.log('123' + plus.navigator.isFullscreen())
},
getCamera() {
var cmr = plus.camera.getCamera(1);
console.log('cmr' + JSON.stringify(cmr))
// plus.navigator.setFullscreen(true);
// console.log('123' + plus.navigator.isFullscreen())
setTimeout(() => {
const cameraView = this.$refs.cameraView;  

// 将摄像头画面渲染到页面上的 view 元素中  
cameraView.$el.appendChild(cmr.stream, 'pop-in');  

}, 1000)  

},
}
}

操作步骤:

将页面设置为横屏,同时通过live-pusher等方式调用摄像头显示摄像头画面,通过标准基座将项目运行到ios设备上。

预期结果:

显示内容和屏幕同时旋转90度

实际结果:

屏幕翻转后摄像头显示内容翻转了180度,且显示内容仅包括了同情况下相机显示内容中左上角的一部分。

bug描述:

在ios下调用摄像头时,将屏幕设置为横向,手机画面会比应当显示的画面多旋转了90度,与屏幕方向不一致。


1 回复

在使用 uni-app 开发 iOS 应用时,如果调用摄像头并希望将屏幕调整为横向显示,但发现画面逆转了 90 度,可能是由于设备的默认方向设置或摄像头的方向处理不当导致的。以下是一些可能的解决方案:

1. 强制屏幕方向

首先,你可以尝试强制屏幕方向为横向。在 pages.json 中配置页面的屏幕方向:

{
  "pages": [
    {
      "path": "pages/index/index",
      "style": {
        "navigationBarTitleText": "首页",
        "pageOrientation": "landscape" // 强制横向
      }
    }
  ]
}

2. 处理摄像头方向

在 iOS 设备上,摄像头的数据流可能默认是竖屏的,因此当你强制横屏时,画面可能会逆转。你需要在代码中手动调整摄像头的方向。

uni.createCameraContext() 中,你可以通过 orientation 参数来指定摄像头的方向。例如:

const cameraContext = uni.createCameraContext();

cameraContext.start({
  success: function (res) {
    console.log('摄像头启动成功');
  },
  fail: function (err) {
    console.log('摄像头启动失败', err);
  }
});

// 设置摄像头方向为横向
cameraContext.setOrientation({
  orientation: 'landscape'
});

3. 使用 uni.rotate 调整画面

如果上述方法仍然无法解决问题,你可以尝试使用 uni.rotate 来手动调整画面方向。例如:

const cameraContext = uni.createCameraContext();

cameraContext.start({
  success: function (res) {
    console.log('摄像头启动成功');
  },
  fail: function (err) {
    console.log('摄像头启动失败', err);
  }
});

// 手动旋转画面
uni.rotate({
  angle: 90, // 旋转90度
  success: function (res) {
    console.log('画面旋转成功');
  },
  fail: function (err) {
    console.log('画面旋转失败', err);
  }
});

4. 使用 CSS 调整画面方向

你也可以尝试使用 CSS 来调整画面方向。例如:

<view class="camera-container">
  <camera style="transform: rotate(90deg);"></camera>
</view>
.camera-container {
  width: 100%;
  height: 100%;
  display: flex;
  justify-content: center;
  align-items: center;
}

5. 检查设备方向

确保设备的自动旋转功能是开启的,并且设备本身支持横向模式。你可以在 manifest.json 中配置应用支持的方向:

{
  "app-plus": {
    "screenOrientation": [
      "portrait-primary",
      "landscape-primary",
      "landscape-secondary"
    ]
  }
}
回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!