【问题标题】:how to disable rotation in React Native?如何在 React Native 中禁用旋转?
【发布时间】:2015-11-17 12:53:23
【问题描述】:

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

【问题讨论】:

  • 您不能只在应用程序属性中设置支持的方向(与任何其他 iOS 应用程序相同)吗?
  • 安卓怎么样?
  • @ooolala 在这个 SO 答案中回答 stackoverflow.com/questions/34078354/…
  • 注意:在我的 MOTO 4 上,我无法让 sensorPortrait 正常工作。它永远不会支持颠倒的肖像(即reversePortrait)。然而,使用fullSensor 确实有效,但需要注意的是也允许景观。这对我来说很好,但如果你只想要 portraitreversePortrait,你可以使用 onConfigurationChangednewConfig.orientation 拦截 Activity 中的方向变化,然后忽略或覆盖横向变化。
  • 在 React 中禁用移动屏幕旋转怎么样? (不是 React Native)元标记不起作用。

标签: ios react-native


【解决方案1】:

React Native 应用程序几乎只是一个普通的 iOS 应用程序,因此您可以按照与所有其他应用程序完全相同的方式进行操作。只需在常规应用程序属性中取消选中(在 XCode 中)“横向左”和“横向右”作为允许的设备方向:

【讨论】:

  • 谢谢!还有一个问题,我检查了portraitupside down,但是当我旋转模拟器的屏幕(90 度两次)时,我的应用程序没有自动旋转,这是什么问题?
  • 试过了。在 iPad (Pro) 模拟器上运行时似乎不适用于 RN 34。但是,它在 iPhone 模拟器上运行时确实有效。我需要它在 iPad 上工作。奇怪。
  • 原来我需要将“设备”设置为 iPad,而不是像以前那样设置为“通用”。这使它起作用了。
  • @Jarek Potiuk 先生我有一个小小的疑问,实际上当我运行我的模拟器时,我的模拟器默认显示横向模式,我使用了 Landscapeleft&right 。但是,现在它没有在设备中显示横向模式。我正在使用反应原生方向模块,并在 xcode 中选择横向左右。但是,我没有得到
  • 由于某种原因,这不再起作用了。至少不在react-native 0.45.1
【解决方案2】:

对于 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

【讨论】:

  • 这非常有效。只是为了使用 VS Code 的其他人的利益:从“命令面板...”执行“在设备/模拟器上运行 Android”。摇动设备以“重新加载”应用程序将不起作用。
【解决方案3】:

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

文档:

更多信息见:

【讨论】:

  • 在我关闭设备上的 expo 并重新启动后工作
  • 有没有办法把它分开,像 Ipad 只允许横向和 iPhone 只允许纵向?
  • 这是适用于我的解决方案。关闭插页式广告后,我的主视图旋转了 180 度。所以我应该做一个硬编码的 Expo.ScreenOrientation.allowAsync(Expo.ScreenOrientation.Orientation.LANDSCAPE_LEFT);
【解决方案4】:

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

【讨论】:

  • 2020年最佳答案,涵盖iOS和Android
  • 不错的答案。 ankit
  • 嗨,我将 app.json 中的方向更改为“纵向”,当我旋转设备时,屏幕上的项目仍然不旋转,但是当我按下文本输入时,键盘会旋转.为什么会这样?
【解决方案5】:

对于安卓: 在您的清单文件中放置:

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

然后在应用标签里面放:

tools:ignore="LockedOrientationActivity"

然后在所有活动集中:

android:screenOrientation="portrait"

【讨论】:

    【解决方案6】:

    对于 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>
    

    【讨论】:

      【解决方案7】:

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

      【讨论】:

        【解决方案8】:

        安卓

        进入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>
        

        IOS

        很简单,您必须从 XCODE 中取消选中旋转模式

        在此处输入图片描述

        来自 ANKIT-DETROJ 的回答。

        【讨论】:

          【解决方案9】:

          您可以使用react-native-orientation-locker 模块和lockToPortrait() 函数。
          如果您还希望某些屏幕具有解锁方向,这会很有帮助 - 在这种情况下,您还可以使用 unlockAllOrientations() 函数。

          【讨论】:

            【解决方案10】:

            将此用于 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>
            

            【讨论】:

            【解决方案11】:

            如果您使用的是 RN expo 项目,并且应用程序包含 react-navigation,那么设置导航到以下代码对我有帮助。

            const AppNavigator = createStackNavigator(
            {
                Page1: { screen: Page1}
            },
            {
                portraitOnlyMode: true
            });
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2021-07-13
              • 1970-01-01
              • 1970-01-01
              • 2020-01-19
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多