This documentation is available as Markdown for AI agents and LLMs. See the full Markdown index or append .md to any documentation URL.
This is documentation for the next SDK version. For up-to-date documentation, see the latest version (SDK 57).
Expo 屏幕方向
用于管理设备屏幕方向的通用库。
屏幕方向是指图形在设备上绘制时所采用的方向。例如,下图中的设备在物理上处于竖直和水平方向,但屏幕方向是纵向。有关物理设备方向,请参阅 Device Motion 的 orientation 部分。
在 Android 和 iOS 平台上,对屏幕方向的更改会覆盖任何系统设置或用户偏好。在 Android 上,可以在考虑用户首选方向的同时更改屏幕方向。在 iOS 上,应用无法访问用户和系统设置,任何对屏幕方向的更改都会覆盖现有设置。
Web 仅有有限支持。
iOS 27 及更高版本中的方向锁定 iOS
从 iOS 27 开始,iPhone 应用可以调整大小,例如在 macOS 上使用 iPhone 镜像或在 iPad 上运行时。应用可调整大小时,系统会将受支持的方向视为偏好,而不是要求。这会带来两个后果:
lockAsync可能不会生效。系统可以拒绝该请求,而你的应用会保持可调整大小的状态。getOrientationAsync可能无法描述应用所绘制窗口的形状。无论窗口的宽高比如何,iPhone 镜像始终会报告纵向方向。
请设计能够适应可用空间的屏幕,而不要依赖固定方向。在调试构建中,当系统拒绝方向锁定时,此库会记录警告。利用这些警告找出仍然依赖平台不再保证的方向锁定的屏幕。
安装
- npx expo install expo-screen-orientationIf you are installing this in an existing React Native app, make sure to install expo in your project.
警告
Apple 在 iOS 9 中为 iPad 添加了对 分屏视图 模式的支持。这改变了系统处理屏幕方向的方式。简而言之,对于 iOS 而言,除非您打开两个并排显示的应用,否则您的 iPad 始终处于横屏模式。要使用此模块锁定屏幕方向,您需要在应用配置中将 ios.requireFullScreen 设置为 true,以禁用对此功能的支持。
在 iOS 27 及更高版本中,requireFullScreen 不再阻止应用调整大小,因此无法可靠地锁定屏幕方向。请参阅iOS 27 及更高版本中的方向锁定。有关 分屏视图 模式的更多信息,请参阅Apple 官方文档。
在应用配置中进行配置
如果你在项目中使用配置插件(Continuous Native Generation (CNG)),可以使用 expo-screen-orientation 内置的 config plugin 进行配置。该插件允许你配置运行时无法设置、并且需要重新构建新的应用二进制文件才会生效的各种属性。如果你的应用不使用 CNG,那么你需要手动配置该库。
Example app.json with config plugin
{ "expo": { "ios": { "requireFullScreen": true }, "plugins": [ [ "expo-screen-orientation", { "initialOrientation": "DEFAULT" } ] ] } }
Configurable properties
| Name | Default | Description |
|---|---|---|
initialOrientation | undefined | Only for: iOS 设置 iOS 的初始屏幕方向。可选值: |
Are you using this library in an existing React Native app?
- 在 Xcode 中使用
xed ios打开 ios 目录。如果你没有该目录,请运行npx expo prebuild -p ios生成一个。 - 在 Xcode 中勾选
Requires Full Screen复选框。它应位于 Project Target > General > Deployment Info 下。
使用 Expo Router 按页面设置屏幕方向
如果你使用 Expo Router,可以在每个页面上使用 Stack.Screen 的 orientation 选项来设置方向。此功能由 react-native-screens 提供支持,是在堆栈导航器中按页面设置方向的推荐方式。
import { Stack } from 'expo-router'; export default function Layout() { return ( <Stack> <Stack.Screen name="index" options={{ orientation: 'portrait' }} /> <Stack.Screen name="landscape" options={{ orientation: 'landscape' }} /> </Stack> ); }
API
import * as ScreenOrientation from 'expo-screen-orientation';
Methods
Gets the current screen orientation.
Promise<Orientation>Returns a promise that fulfils with an Orientation
value that reflects the current screen orientation.
Gets the current screen orientation lock type.
Promise<OrientationLock>Returns a promise which fulfils with an OrientationLock
value.
Gets the platform specific screen orientation lock type.
Promise<PlatformOrientationInfo>Returns a promise which fulfils with a PlatformOrientationInfo
value.
| Parameter | Type | Description |
|---|---|---|
| orientationLock | OrientationLock | The orientation lock to apply. See the |
Lock the screen orientation to a particular OrientationLock.
Promise<void>Returns a promise with void value, which fulfils when the orientation is set.
Example
async function changeScreenOrientation() { await ScreenOrientation.lockAsync(ScreenOrientation.OrientationLock.LANDSCAPE_LEFT); }
| Parameter | Type | Description |
|---|---|---|
| options | PlatformOrientationInfo | The platform specific lock to apply. See the |
Promise<void>Returns a promise with void value, resolving when the orientation is set and rejecting
if an invalid option or value is passed.
| Parameter | Type |
|---|---|
| orientationLock | OrientationLock |
Returns whether the OrientationLock policy is supported on
the device.
Promise<boolean>Returns a promise that resolves to a boolean value that reflects whether or not the
orientationLock is supported.
Sets the screen orientation back to the OrientationLock.DEFAULT policy.
Promise<void>Returns a promise with void value, which fulfils when the orientation is set.
Event subscriptions
| Parameter | Type | Description |
|---|---|---|
| listener | OrientationChangeListener | Each orientation update will pass an object with the new |
Invokes the listener function when the screen orientation changes from portrait to landscape
or from landscape to portrait. For example, it won't be invoked when screen orientation
change from portrait up to portrait down, but it will be called when there was a change from
portrait up to landscape left.
EventSubscriptionDeprecated: this function will be removed in a future version. Use
subscription.remove()instead.
| Parameter | Type | Description |
|---|---|---|
| subscription | EventSubscription | A subscription object that manages the updates passed to a listener function on an orientation change. |
Unsubscribes the listener associated with the Subscription object from all orientation change
updates.
voidDeprecated: this function will be removed in future versions. Keep track of your own subscriptions.
Removes all listeners subscribed to orientation change updates.
voidInterfaces
A subscription object that allows to conveniently remove an event listener from the emitter.
Types
| Property | Type | Description |
|---|---|---|
| orientationInfo | ScreenOrientationInfo | The current |
| orientationLock | OrientationLock | The current |
| Property | Type | Description |
|---|---|---|
| screenOrientationArrayIOS(optional) | Orientation[] | Only for: iOS An array of orientations to allow on the iOS platform. |
| screenOrientationConstantAndroid(optional) | number | Only for: Android A constant to set using the Android native API.
For example, in order to set the lock policy to unspecified,
|
| screenOrientationLockWeb(optional) | WebOrientationLock | Only for: Web A web orientation lock to apply in the browser. |
| Property | Type | Description |
|---|---|---|
| horizontalSizeClass(optional) | SizeClassIOS | Only for: iOS The horizontal size class of the device. |
| orientation | Orientation | The current orientation of the device. |
| verticalSizeClass(optional) | SizeClassIOS | Only for: iOS The vertical size class of the device. |
Enums
Orientation.UNKNOWN = 0An unknown screen orientation. For example, the device is flat, perhaps on a table.
An enum whose values can be passed to the lockAsync
method.
Note:
OrientationLock.ALLandOrientationLock.PORTRAITare invalid on devices which don't supportOrientationLock.PORTRAIT_DOWN.
OrientationLock.DEFAULT = 0The default orientation. On iOS, this will allow all orientations except Orientation.PORTRAIT_DOWN.
On Android, this lets the system decide the best orientation.
OrientationLock.OTHER = 8A platform specific orientation. This is not a valid policy that can be applied in lockAsync.
OrientationLock.UNKNOWN = 9An unknown screen orientation lock. This is not a valid policy that can be applied in lockAsync.
Each iOS device has a default set of size classes that you can use as a guide when designing your interface.
An enum representing the lock policies that can be applied on the web platform, modelled after
the W3C specification.
These values can be applied through the lockPlatformAsync
method.