如何在React Native中禁用旋转?


104

我只支持纵向视图。我该如何使React Native应用程序不自动旋转?我尝试搜索文档和Github问题,但没有发现任何帮助。


您不能仅在应用程序属性中设置受支持的方向(与其他任何iOS应用程序相同)吗?
Thilo

8
那么Android呢?
ooolala '16

2
@ooolala在这个答案中的答案stackoverflow.com/questions/34078354/…–
MonkeyBonkey

注意:在我的MOTO 4上,我无法sensorPortrait正常工作。它永远不会支持颠倒的人像(即reversePortrait)。但是,使用fullSensor确实可行,但同时也需要允许景观。最终对我来说还不错,但是如果您只想要portraitreversePortrait,则可以使用onConfigurationChanged和拦截“活动”中的方向变化,newConfig.orientation而忽略或覆盖横向变化。
约书亚·品特

Answers:


133

React Native应用程序几乎只是一个普通的iOS应用程序,因此您可以使用与其他所有应用程序完全相同的方式来进行操作。只需在常规应用程序属性中取消选中(在XCode中)“ Landscape Left”和“ Landscape Right”即可:

设备方向


谢谢!一个问题,我检查portraitupside down,但是当我旋转模拟器的屏幕(90度的两倍),有什么问题我的应用程序没有自转?
syg

试过了。在iPad(Pro)模拟器上运行时,似乎无法与RN 34配合使用。但是,在iPhone模拟器上运行时,它确实可以工作。我需要它才能在iPad上工作。奇怪。
Pedram

1
原来我需要将“设备”设置为iPad,而不是像以前那样设置为“通用”。这使它起作用。
Pedram

@Jarek Potiuk先生,我有一个小疑问,实际上,当我运行我的模拟器时,默认情况下显示landscapemode,而我使用landscapeleft&right。但是,现在它不显示设备中的横向模式。我正在使用react native定向模块,并在xcode中选择左右横向。但是,我没有得到
Lavaraju

2
由于某种原因,这不再起作用。至少不在react-native 0.45.1
MattyK14'7

79

对于iOS,Jarek的答案很好。

对于Android,您需要编辑AndroidManifest.xml文件。将以下行添加到要锁定为纵向模式的每个活动:

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


2
这工作得很好。仅出于其他使用VS Code的好处:从“命令面板...”执行“在设备/模拟器上运行Android”。摇晃设备以“重新加载”该应用程序将不起作用。
Rishi

66

2017年更新: {"orientation": "portrait"}

目前,许多像这样的官方React Native指南都建议在构建React Native应用时使用Expo。因此,除了现有答案外,我还将添加一个Expo专用解决方案,这一点值得注意,因为它适用于iOS和Android,并且您只需要只需设置一次即可,而无需与XCode配置,AndroidManifest.xml等混淆。

在构建时设置方向:

如果您正在使用Expo构建React Native应用,则可以使用文件中的orientation字段app.json-例如:

{
  "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设备上,除了反向肖像外,所有其他四个方向都可以。
  • PORTRAIT —纵向方向,在某些Android设备上也可以是反向肖像。
  • PORTRAIT_UP —仅上侧肖像。
  • PORTRAIT_DOWN —仅上下颠倒肖像。
  • LANDSCAPE —任何横向。
  • LANDSCAPE_LEFT —仅左侧景观。
  • LANDSCAPE_RIGHT —仅适用于正确的景观。

检测旋转:

如果允许多个方向,则可以通过侦听对象change上的事件来检测更改Dimensions

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因此这就是您以不同方式访问事件的原因。

说明文件:

有关更多信息,请参见:


2
我在设备上关闭博览会并重新启动后可以正常工作
BrandonSørenCulley '18

有没有办法将其分开,例如Ipad允许横向,而Iphone仅允许纵向?
7urkm3n

这是在我的情况下有效的解决方案。我的主视图在关闭插页式广告后旋转了180度。因此,我应该编写一个硬编码的Expo.ScreenOrientation.allowAsync(Expo.ScreenOrientation.Orientation.LANDSCAPE_LEFT);
赫尔曼·施瓦茨

15

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中检查或取消选择旋转模式

在此处输入图片说明


2
2020年的最佳答案,涵盖iOS和Android
反复无常的

3

如果您使用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


2

对于Android,您需要编辑AndroidManifest.xml文件。将以下行添加到要锁定为纵向模式的每个活动:

android:screenOrientation =“ 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>

2

对于Android:在清单文件中输入:

xmlns:tools="http://schemas.android.com/tools"

然后在应用程序标签内放:

tools:ignore="LockedOrientationActivity"

然后在所有活动集中:

android:screenOrientation="portrait"

1

将此用于ios ipad Orientaion问题要在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>

1
欢迎使用指向解决方案的链接,但是请确保没有该链接的情况下,您的回答是有用的:在链接周围添加上下文,以便您的其他用户可以了解它的含义和含义,然后引用您所使用页面中最相关的部分如果目标页面不可用,请重新链接。只是链接的答案可能会被删除。
嘟嘟声


-3

如果您正在使用RN expo项目,并且应用程序包含react-navigation,则将导航设置为以下代码对我有帮助。

const AppNavigator = createStackNavigator(
{
    Page1: { screen: Page1}
},
{
    portraitOnlyMode: true
});
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.