如何在 React Native 中禁用旋转?
how to disable rotation in React Native?
我只想支持纵向视图。如何让 React Native 应用程序不自动旋转?
我尝试搜索文档和 Github 问题,但没有找到任何有用的信息。
React Native 应用程序几乎只是一个普通的 iOS 应用程序,因此您可以使用与所有其他应用程序完全相同的方式来完成它。只需取消选中(在 XCode 中)常规应用程序属性中允许的 "Landscape Left" 和 "Landscape Right" 设备方向:
对于 iOS,Jarek 的回答很棒。
对于 Android,您需要编辑 AndroidManifest.xml 文件。将以下行添加到每个要锁定为纵向模式的 activity:
android:screenOrientation="portrait"
因此,完整示例可能如下所示:
<activity
android:name=".MainActivity"
android:label="@string/app_name"
android:configChanges="keyboard|keyboardHidden|orientation|screenSize"
android:windowSoftInputMode="adjustResize"
android:screenOrientation="portrait">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
在此处查看文档中可用 screenOrientation 属性的完整列表:https://developer.android.com/guide/topics/manifest/activity-element.html
2017 年更新:{"orientation": "portrait"}
目前,许多 React Native 官方指南(如 this one)推荐在构建 React Native 应用程序时使用 Expo,因此除了现有的答案之外,我还将添加一个 Expo 特定的解决方案,该解决方案值得注意,因为它适用于两者iOS 和 Android 并且你只需要设置一次而不需要弄乱 XCode 配置,AndroidManifest.xml 等
在构建时设置方向:
如果您使用 Expo 构建 React Native 应用程序,那么您可以在 app.json
文件中使用 orientation
字段 - 例如:
{
"expo": {
"name": "My app",
"slug": "my-app",
"sdkVersion": "21.0.0",
"privacy": "public",
"orientation": "portrait"
}
}
可设置为"portrait"
、"landscape"
或"default"
,表示自动旋转无方向锁定。
在运行时设置方向:
您还可以在运行时通过 运行 覆盖该设置,例如:
Expo.ScreenOrientation.allow(Expo.ScreenOrientation.Orientation.LANDSCAPE);
参数可以是:
ALL
— 所有 4 种可能的方向
ALL_BUT_UPSIDE_DOWN
— 除了反向纵向,在某些 Android 设备上可能是所有 4 个方向。
PORTRAIT
— 纵向,在某些 Android 设备上也可能是反向纵向。
PORTRAIT_UP
— 仅仰视肖像。
PORTRAIT_DOWN
— 仅限上下颠倒的肖像。
LANDSCAPE
— 任意横向。
LANDSCAPE_LEFT
— 仅左侧横向。
LANDSCAPE_RIGHT
— 仅右侧横向。
正在检测旋转:
当您允许多个方向时,您可以通过侦听 Dimensions
对象上的 change
事件来检测变化:
Dimensions.addEventListener('change', (dimensions) => {
// you get:
// dimensions.window.width
// dimensions.window.height
// dimensions.screen.width
// dimensions.screen.height
});
或者您也可以随时使用 Dimensions.get('window')
和 Dimensions.get('screen')
获取尺寸,如下所示:
const dim = Dimensions.get('window');
// you get:
// dim.width
// dim.height
或:
const dim = Dimensions.get('screen');
// you get:
// dim.width
// dim.height
当您收听事件时,您会同时获得 window
和 screen
,这就是您以不同方式访问它的原因。
文档:
有关详细信息,请参阅:
如果您使用的是 RN expo 项目,并且应用程序包含 react-navigation,那么将导航设置为以下代码对我有所帮助。
const AppNavigator = createStackNavigator(
{
Page1: { screen: Page1}
},
{
portraitOnlyMode: true
});
如果您使用 Expo,只需使用以下代码即可:
Expo.ScreenOrientation.allow(Expo.ScreenOrientation.Orientation.PORTRAIT);
渲染前将其放在 App.js 上
所有选项:
ALL
ALL_BUT_UPSIDE_DOWN
PORTRAIT
PORTRAIT_UP
PORTRAIT_DOWN
LANDSCAPE
LANDSCAPE_LEFT
LANDSCAPE_RIGHT
将此用于 ios ipad 方向问题想要更改 plist 文件 https://www.reddit.com/r/reactnative/comments/7vkrfp/disabling_screen_rotate_in_react_native_both/
IOS:
<key>UISupportedInterfaceOrientations</key> <array> <string>UIInterfaceOrientationPortrait</string> <string>UIInterfaceOrientationPortraitUpsideDown</string> </array>
Answer for disable rotation in React Native.
For Android :
转到Androidmenifest.xml文件并添加一行:android:screenOrientation="portrait"
<activity
android:name=".MainActivity"
android:screenOrientation="portrait"
android:configChanges="keyboard|keyboardHidden|orientation|screenSize">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
For IOS :
很简单,您必须从 XCODE
中选中或取消选中旋转模式
您可以使用 react-native-orientation-locker 模块和 lockToPortrait()
函数。
如果您还希望某些屏幕的方向未锁定,这可能会有所帮助 - 在这种情况下,您还可以使用 unlockAllOrientations()
功能。
对于 Android,您需要编辑 AndroidManifest.xml 文件。将以下行添加到每个要锁定为纵向模式的 activity:
android:屏幕方向="portrait"
所以,一个完整的例子可能是这样的:
<application
android:name=".MainApplication"
android:label="@string/app_name"
android:icon="@mipmap/ic_launcher"
android:roundIcon="@mipmap/ic_launcher_round"
android:allowBackup="false"
android:theme="@style/AppTheme">
<activity
android:name=".MainActivity"
android:label="@string/app_name"
android:configChanges="keyboard|keyboardHidden|orientation|screenSize"
android:windowSoftInputMode="adjustResize"
android:screenOrientation="portrait">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name="com.facebook.react.devsupport.DevSettingsActivity" />
</application>
对于Android:
在您的清单文件中输入:
xmlns:tools="http://schemas.android.com/tools"
然后在应用程序标签里面放:
tools:ignore="LockedOrientationActivity"
然后在所有 activity 组中:
android:screenOrientation="portrait"
如果您使用的是react-navigation,那么您只需传递
screenOptions={{ orientation: 'portrait'}}
我只想支持纵向视图。如何让 React Native 应用程序不自动旋转? 我尝试搜索文档和 Github 问题,但没有找到任何有用的信息。
React Native 应用程序几乎只是一个普通的 iOS 应用程序,因此您可以使用与所有其他应用程序完全相同的方式来完成它。只需取消选中(在 XCode 中)常规应用程序属性中允许的 "Landscape Left" 和 "Landscape Right" 设备方向:
对于 iOS,Jarek 的回答很棒。
对于 Android,您需要编辑 AndroidManifest.xml 文件。将以下行添加到每个要锁定为纵向模式的 activity:
android:screenOrientation="portrait"
因此,完整示例可能如下所示:
<activity
android:name=".MainActivity"
android:label="@string/app_name"
android:configChanges="keyboard|keyboardHidden|orientation|screenSize"
android:windowSoftInputMode="adjustResize"
android:screenOrientation="portrait">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
在此处查看文档中可用 screenOrientation 属性的完整列表:https://developer.android.com/guide/topics/manifest/activity-element.html
2017 年更新:{"orientation": "portrait"}
目前,许多 React Native 官方指南(如 this one)推荐在构建 React Native 应用程序时使用 Expo,因此除了现有的答案之外,我还将添加一个 Expo 特定的解决方案,该解决方案值得注意,因为它适用于两者iOS 和 Android 并且你只需要设置一次而不需要弄乱 XCode 配置,AndroidManifest.xml 等
在构建时设置方向:
如果您使用 Expo 构建 React Native 应用程序,那么您可以在 app.json
文件中使用 orientation
字段 - 例如:
{
"expo": {
"name": "My app",
"slug": "my-app",
"sdkVersion": "21.0.0",
"privacy": "public",
"orientation": "portrait"
}
}
可设置为"portrait"
、"landscape"
或"default"
,表示自动旋转无方向锁定。
在运行时设置方向:
您还可以在运行时通过 运行 覆盖该设置,例如:
Expo.ScreenOrientation.allow(Expo.ScreenOrientation.Orientation.LANDSCAPE);
参数可以是:
ALL
— 所有 4 种可能的方向ALL_BUT_UPSIDE_DOWN
— 除了反向纵向,在某些 Android 设备上可能是所有 4 个方向。PORTRAIT
— 纵向,在某些 Android 设备上也可能是反向纵向。PORTRAIT_UP
— 仅仰视肖像。PORTRAIT_DOWN
— 仅限上下颠倒的肖像。LANDSCAPE
— 任意横向。LANDSCAPE_LEFT
— 仅左侧横向。LANDSCAPE_RIGHT
— 仅右侧横向。
正在检测旋转:
当您允许多个方向时,您可以通过侦听 Dimensions
对象上的 change
事件来检测变化:
Dimensions.addEventListener('change', (dimensions) => {
// you get:
// dimensions.window.width
// dimensions.window.height
// dimensions.screen.width
// dimensions.screen.height
});
或者您也可以随时使用 Dimensions.get('window')
和 Dimensions.get('screen')
获取尺寸,如下所示:
const dim = Dimensions.get('window');
// you get:
// dim.width
// dim.height
或:
const dim = Dimensions.get('screen');
// you get:
// dim.width
// dim.height
当您收听事件时,您会同时获得 window
和 screen
,这就是您以不同方式访问它的原因。
文档:
有关详细信息,请参阅:
如果您使用的是 RN expo 项目,并且应用程序包含 react-navigation,那么将导航设置为以下代码对我有所帮助。
const AppNavigator = createStackNavigator(
{
Page1: { screen: Page1}
},
{
portraitOnlyMode: true
});
如果您使用 Expo,只需使用以下代码即可:
Expo.ScreenOrientation.allow(Expo.ScreenOrientation.Orientation.PORTRAIT);
渲染前将其放在 App.js 上
所有选项:
ALL
ALL_BUT_UPSIDE_DOWN
PORTRAIT
PORTRAIT_UP
PORTRAIT_DOWN
LANDSCAPE
LANDSCAPE_LEFT
LANDSCAPE_RIGHT
将此用于 ios ipad 方向问题想要更改 plist 文件 https://www.reddit.com/r/reactnative/comments/7vkrfp/disabling_screen_rotate_in_react_native_both/
IOS:
<key>UISupportedInterfaceOrientations</key> <array> <string>UIInterfaceOrientationPortrait</string> <string>UIInterfaceOrientationPortraitUpsideDown</string> </array>
Answer for disable rotation in React Native.
For Android :
转到Androidmenifest.xml文件并添加一行:android:screenOrientation="portrait"
<activity
android:name=".MainActivity"
android:screenOrientation="portrait"
android:configChanges="keyboard|keyboardHidden|orientation|screenSize">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
For IOS :
很简单,您必须从 XCODE
中选中或取消选中旋转模式您可以使用 react-native-orientation-locker 模块和 lockToPortrait()
函数。
如果您还希望某些屏幕的方向未锁定,这可能会有所帮助 - 在这种情况下,您还可以使用 unlockAllOrientations()
功能。
对于 Android,您需要编辑 AndroidManifest.xml 文件。将以下行添加到每个要锁定为纵向模式的 activity:
android:屏幕方向="portrait"
所以,一个完整的例子可能是这样的:
<application
android:name=".MainApplication"
android:label="@string/app_name"
android:icon="@mipmap/ic_launcher"
android:roundIcon="@mipmap/ic_launcher_round"
android:allowBackup="false"
android:theme="@style/AppTheme">
<activity
android:name=".MainActivity"
android:label="@string/app_name"
android:configChanges="keyboard|keyboardHidden|orientation|screenSize"
android:windowSoftInputMode="adjustResize"
android:screenOrientation="portrait">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name="com.facebook.react.devsupport.DevSettingsActivity" />
</application>
对于Android: 在您的清单文件中输入:
xmlns:tools="http://schemas.android.com/tools"
然后在应用程序标签里面放:
tools:ignore="LockedOrientationActivity"
然后在所有 activity 组中:
android:screenOrientation="portrait"
如果您使用的是react-navigation,那么您只需传递
screenOptions={{ orientation: 'portrait'}}