如何在 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

当您收听事件时,您会同时获得 windowscreen,这就是您以不同方式访问它的原因。

文档:

有关详细信息,请参阅:

如果您使用的是 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'}}