更新记录
1.0.0(2026-04-21)
新增功能
- 基于 UTS 原生混编方式实现
- iOS Swift 原生实现(iOS 13.0+)
- Android Kotlin 原生实现(API 21+)
屏幕方向控制
- 支持四种方向:竖屏、竖屏倒置、横屏左、横屏右
- 支持自动旋转模式
- setOrientation - 设置屏幕方向
- getOrientation - 获取当前屏幕方向
状态栏控制
- setStatusBarVisible - 控制状态栏显示/隐藏(支持动画)
- setStatusBarStyle - 设置状态栏样式(深色/浅色/默认)
- getStatusBarInfo - 获取状态栏信息(可见性、样式、高度)
HomeIndicator 控制(仅 iOS)
- setHomeIndicatorVisible - 控制底部横条的显示/隐藏
屏幕旋转监听
- addOrientationChangeListener - 添加屏幕旋转监听器
- removeOrientationChangeListener - 移除屏幕旋转监听器
系统要求
- iOS 13.0+
- Android 5.0+ (API 21+)
- HBuilderX 3.6.8+
- uni-app 3.1.0+
技术实现
- iOS: Swift + UIKit
- Android: Kotlin + AndroidX
- UTS 原生混编
错误处理
- 9040001: 功能不支持
- 9040002: 参数错误
- 9040003: 操作失败
- 9040004: 权限不足
平台兼容性
uni-app(4.84)
| Vue2 | Vue3 | Chrome | Safari | app-vue | app-nvue | Android | Android插件版本 | iOS | iOS插件版本 | 鸿蒙 |
|---|---|---|---|---|---|---|---|---|---|---|
| - | - | - | - | - | - | 5.0 | 1.0.0 | 12 | 1.0.0 | - |
| 微信小程序 | 支付宝小程序 | 抖音小程序 | 百度小程序 | 快手小程序 | 京东小程序 | 鸿蒙元服务 | QQ小程序 | 飞书小程序 | 小红书小程序 | 快应用-华为 | 快应用-联盟 |
|---|---|---|---|---|---|---|---|---|---|---|---|
| - | - | - | - | - | - | - | - | - | - | - | - |
mm-screen-toggle
基于 UTS 原生混编实现的屏幕控制插件,支持横竖屏切换、状态栏控制、HomeIndicator 控制。
功能特性
- ✅ 屏幕方向控制(横屏/竖屏/自动旋转,四种方向)
- ✅ 状态栏显示/隐藏
- ✅ 状态栏样式切换(深色/浅色/默认)
- ✅ 获取状态栏信息(可见性、样式、高度)
- ✅ HomeIndicator 显示/隐藏(仅 iOS)
- ✅ 屏幕旋转监听(支持添加/移除监听)
系统要求
- iOS: 13.0+
- Android: API 21+ (Android 5.0+)
- HBuilderX: 3.6.8+
- uni-app: 3.1.0+
导入插件
import {
setOrientation,
getOrientation,
setStatusBarVisible,
setStatusBarStyle,
getStatusBarInfo,
setHomeIndicatorVisible,
addOrientationChangeListener,
removeOrientationChangeListener
} from '@/uni_modules/mm-screen-toggle';
API 文档
1. setOrientation(options) - 设置屏幕方向
设置应用的屏幕方向。
参数:
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| orientation | ScreenOrientation |
是 | 屏幕方向 |
| success | () => void |
否 | 成功回调 |
| fail | (err: ScreenToggleFail) => void |
否 | 失败回调 |
| complete | () => void |
否 | 完成回调 |
ScreenOrientation 类型:
| 值 | 说明 |
|---|---|
portrait |
竖屏(Home键在下) |
portraitUpsideDown |
竖屏倒置(Home键在上) |
landscapeLeft |
横屏(Home键在左) |
landscapeRight |
横屏(Home键在右) |
auto |
自动旋转(跟随系统) |
landscape |
横屏(自动) |
示例:
setOrientation({
orientation: 'landscapeLeft',
success: () => {
console.log('设置屏幕方向成功');
},
fail: (err) => {
console.error('设置失败:', err.errMsg);
}
});
2. getOrientation(options) - 获取当前屏幕方向
获取应用当前的屏幕方向。
参数:
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| success | (res: GetOrientationResult) => void |
是 | 成功回调 |
| fail | (err: ScreenToggleFail) => void |
否 | 失败回调 |
| complete | () => void |
否 | 完成回调 |
GetOrientationResult 结构:
| 字段 | 类型 | 说明 |
|---|---|---|
| orientation | ScreenOrientation |
当前屏幕方向 |
示例:
getOrientation({
success: (res) => {
console.log('当前方向:', res.orientation);
}
});
3. setStatusBarVisible(options) - 设置状态栏可见性
控制状态栏的显示和隐藏。
参数:
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| visible | boolean |
是 | 是否显示状态栏 |
| animated | boolean |
否 | 是否使用动画效果(默认 true) |
| success | () => void |
否 | 成功回调 |
| fail | (err: ScreenToggleFail) => void |
否 | 失败回调 |
| complete | () => void |
否 | 完成回调 |
示例:
// 隐藏状态栏(带动画)
setStatusBarVisible({
visible: false,
animated: true,
success: () => {
console.log('状态栏已隐藏');
}
});
// 显示状态栏
setStatusBarVisible({
visible: true,
animated: true
});
4. setStatusBarStyle(options) - 设置状态栏样式
设置状态栏的图标样式。
参数:
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| style | StatusBarStyle |
是 | 状态栏样式 |
| success | () => void |
否 | 成功回调 |
| fail | (err: ScreenToggleFail) => void |
否 | 失败回调 |
| complete | () => void |
否 | 完成回调 |
StatusBarStyle 类型:
| 值 | 说明 |
|---|---|
dark |
深色图标(适用于浅色背景) |
light |
浅色图标(适用于深色背景) |
default |
默认样式(跟随系统) |
示例:
// 设置为深色图标(白色背景使用)
setStatusBarStyle({
style: 'dark',
success: () => {
console.log('状态栏样式已设置');
}
});
// 设置为浅色图标(深色背景使用)
setStatusBarStyle({
style: 'light'
});
5. getStatusBarInfo(options) - 获取状态栏信息
获取状态栏的当前状态信息。
参数:
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| success | (res: GetStatusBarInfoResult) => void |
是 | 成功回调 |
| fail | (err: ScreenToggleFail) => void |
否 | 失败回调 |
| complete | () => void |
否 | 完成回调 |
GetStatusBarInfoResult 结构:
| 字段 | 类型 | 说明 |
|---|---|---|
| visible | boolean |
状态栏是否可见 |
| style | StatusBarStyle |
状态栏样式 |
| height | number |
状态栏高度(px) |
示例:
getStatusBarInfo({
success: (res) => {
console.log('状态栏可见:', res.visible);
console.log('状态栏样式:', res.style);
console.log('状态栏高度:', res.height);
}
});
6. setHomeIndicatorVisible(options) - 设置 HomeIndicator 可见性(仅 iOS)
控制 iOS 底部 Home Indicator 的显示和隐藏。
参数:
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| visible | boolean |
是 | 是否显示 HomeIndicator |
| animated | boolean |
否 | 是否使用动画效果(默认 true) |
| success | () => void |
否 | 成功回调 |
| fail | (err: ScreenToggleFail) => void |
否 | 失败回调 |
| complete | () => void |
否 | 完成回调 |
注意: 此功能仅支持 iOS,Android 调用会返回错误码 9040001(功能不支持)。
示例:
setHomeIndicatorVisible({
visible: false,
success: () => {
console.log('HomeIndicator 已隐藏');
}
});
7. addOrientationChangeListener(options) - 添加屏幕旋转监听
监听设备屏幕方向的变化。
参数:
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| callback | (res: OrientationChangeResult) => void |
是 | 旋转变化回调 |
| success | () => void |
否 | 成功回调 |
| fail | (err: ScreenToggleFail) => void |
否 | 失败回调 |
| complete | () => void |
否 | 完成回调 |
OrientationChangeResult 结构:
| 字段 | 类型 | 说明 |
|---|---|---|
| orientation | ScreenOrientation |
新的屏幕方向 |
示例:
addOrientationChangeListener({
callback: (res) => {
console.log('屏幕方向已变为:', res.orientation);
// 根据方向调整UI
if (res.orientation === 'landscapeLeft' || res.orientation === 'landscapeRight') {
console.log('横屏模式');
} else {
console.log('竖屏模式');
}
},
success: () => {
console.log('监听器已添加');
}
});
8. removeOrientationChangeListener(options) - 移除屏幕旋转监听
移除之前添加的屏幕旋转监听器。
参数:
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| success | () => void |
否 | 成功回调 |
| fail | (err: ScreenToggleFail) => void |
否 | 失败回调 |
| complete | () => void |
否 | 完成回调 |
示例:
removeOrientationChangeListener({
success: () => {
console.log('监听器已移除');
}
});
错误码
| 错误码 | 说明 |
|---|---|
| 9040001 | 功能不支持 |
| 9040002 | 参数错误 |
| 9040003 | 操作失败 |
| 9040004 | 权限不足 |
完整使用示例
import {
setOrientation,
getOrientation,
setStatusBarVisible,
setStatusBarStyle,
getStatusBarInfo,
setHomeIndicatorVisible,
addOrientationChangeListener,
removeOrientationChangeListener
} from '@/uni_modules/mm-screen-toggle';
export default {
data() {
return {
currentOrientation: 'portrait',
statusBarHeight: 0
};
},
onLoad() {
// 获取初始状态栏信息
this.getStatusBarInfo();
// 添加屏幕旋转监听
this.addRotationListener();
},
onUnload() {
// 页面卸载时移除监听
removeOrientationChangeListener({
success: () => {
console.log('监听器已移除');
}
});
},
methods: {
// 设置为横屏
setLandscape() {
setOrientation({
orientation: 'landscapeLeft',
success: () => {
uni.showToast({ title: '已切换为横屏', icon: 'success' });
}
});
},
// 设置为竖屏
setPortrait() {
setOrientation({
orientation: 'portrait',
success: () => {
uni.showToast({ title: '已切换为竖屏', icon: 'success' });
}
});
},
// 获取状态栏信息
getStatusBarInfo() {
getStatusBarInfo({
success: (res) => {
this.statusBarHeight = res.height;
console.log('状态栏高度:', res.height);
}
});
},
// 隐藏状态栏
hideStatusBar() {
setStatusBarVisible({
visible: false,
animated: true,
success: () => {
console.log('状态栏已隐藏');
}
});
},
// 显示状态栏
showStatusBar() {
setStatusBarVisible({
visible: true,
animated: true
});
},
// 设置深色状态栏
setDarkStatusBar() {
setStatusBarStyle({
style: 'dark',
success: () => {
console.log('状态栏样式已设置为深色');
}
});
},
// 设置浅色状态栏
setLightStatusBar() {
setStatusBarStyle({
style: 'light',
success: () => {
console.log('状态栏样式已设置为浅色');
}
});
},
// 隐藏 Home Indicator(仅 iOS)
hideHomeIndicator() {
setHomeIndicatorVisible({
visible: false,
success: () => {
console.log('HomeIndicator 已隐藏');
},
fail: (err) => {
if (err.errCode === 9040001) {
uni.showToast({ title: '当前设备不支持此功能', icon: 'none' });
}
}
});
},
// 添加旋转监听
addRotationListener() {
addOrientationChangeListener({
callback: (res) => {
this.currentOrientation = res.orientation;
console.log('屏幕方向变化:', res.orientation);
// 可以根据方向变化调整UI布局
this.adjustUIForOrientation(res.orientation);
},
success: () => {
console.log('旋转监听已添加');
}
});
},
// 根据方向调整UI
adjustUIForOrientation(orientation) {
const isLandscape = orientation === 'landscapeLeft' || orientation === 'landscapeRight';
// 根据横竖屏调整布局
if (isLandscape) {
console.log('横屏布局');
} else {
console.log('竖屏布局');
}
}
}
};
注意事项
-
iOS 配置
- 在 iOS 项目中,确保
Info.plist中配置了支持的屏幕方向 - HomeIndicator 控制需要 iOS 11.0+
- 在 iOS 项目中,确保
-
Android 配置
- 在
AndroidManifest.xml中配置android:screenOrientation属性 - 部分功能需要在 Activity 中设置
FLAG_LAYOUT_NO_LIMITS
- 在
-
生命周期管理
- 使用
addOrientationChangeListener添加监听后,在页面卸载时务必调用removeOrientationChangeListener移除监听 - 建议在
onLoad中添加监听,在onUnload中移除监听
- 使用
-
状态栏样式
dark表示深色图标,适用于浅色背景light表示浅色图标,适用于深色背景- 设置样式后,状态栏背景颜色需要通过 CSS 单独设置
-
测试
- 建议在真机上测试屏幕旋转功能
- 模拟器可能无法完全模拟所有旋转场景
开发文档
许可证
MIT

收藏人数:
购买源码授权版(
试用
赞赏(0)
下载 38
赞赏 0
下载 11616461
赞赏 1906
赞赏
京公网安备:11010802035340号