как отключить ротацию в React Native?

104

Я хотел бы поддерживать только портретный вид. Как я могу заставить приложение React Native не автоповоротиться? Я пробовал искать документацию и проблемы с Github, но ничего полезного не нашел.

syg
источник
Нельзя ли просто установить поддерживаемые ориентации в свойствах приложения (как и в любом другом приложении для iOS)?
Тило,
8
А как насчет Android?
ooolala
2
@ooolala ответ в этом SO-ответе stackoverflow.com/questions/34078354/…
MonkeyBonkey 01
ПРИМЕЧАНИЕ. На моем MOTO 4 я не мог sensorPortraitнормально работать. Он никогда не поддерживает перевернутый портрет (т.е. reversePortrait). Тем fullSensorне менее, использование действительно сработало, но оно также допускало пейзаж. В итоге для меня это было хорошо, но если вы хотите только portraitи reversePortrait, вы можете перехватить изменение ориентации в своей деятельности с помощью onConfigurationChangedи newConfig.orientationи просто игнорировать или переопределить изменения ландшафта.
Джошуа Пинтер

Ответы:

133

Приложение React Native - это в значительной степени обычное приложение для iOS, поэтому вы можете делать это точно так же, как и для всех других приложений. Просто снимите галочки (в XCode) с «Пейзаж слева» и «Пейзаж справа», как разрешено Ориентация устройства в общих свойствах приложения:

Ориентация устройства

Ярек Потюк
источник
Спасибо! еще один вопрос, я проверил portraitи upside down, но мое приложение не автоматически поворачивается, когда я поворачиваю экран симулятора (на 90 градусов дважды), в чем проблема?
syg
Пробовал. Не работает с RN 34 при работе на симуляторе iPad (Pro). Однако он работает на симуляторе iPhone. Хотя мне нужно, чтобы он работал на iPad. Странный.
Педрам,
1
Оказывается, мне нужно установить «Устройства» как iPad, а не «Универсальный», как это было раньше. Это заставило его работать.
Pedram 03
Мистер @Jarek Potiuk, у меня небольшое сомнение, на самом деле, когда я был запущен, мой симулятор по умолчанию показывает ландшафтный режим, я использовал ландшафт влево и вправо. но сейчас он не показывает ландшафтный режим в устройстве. Я использую собственный модуль ориентации, а в xcode выбираю альбомную ориентацию слева и справа. но я не получил
Lavaraju
2
По какой-то причине это больше не работает. По крайней мере, не вreact-native 0.45.1
MattyK14
79

Для iOS ответ Ярека великолепен.

Для 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 на устройстве / симуляторе» из «Палитры команд ...». Встряхнуть устройство, чтобы «перезагрузить» приложение не получится.
Риши
66

Обновление 2017: {"orientation": "portrait"}

В настоящее время много официальных руководств по React Native, подобных этому рекомендуют использовать Expo при создании приложений React Native, поэтому в дополнение к существующим ответам я также добавлю решение для Expo, которое стоит отметить, потому что оно работает как для iOS, так и для Android, и вам нужно только установите его один раз без необходимости возиться с конфигурацией XCode, AndroidManifest.xml и т. д.

Установка ориентации во время сборки:

Если вы создаете свои приложения React Native с помощью Expo, вы можете использовать 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 могут быть все 4 ориентации.
  • 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

Когда вы слушаете событие, вы получаете windowиscreen одновременно, поэтому к нему доступ по-разному.

Документация:

Для получения дополнительной информации см .:

rsp
источник
2
работает после того, как я закрыл выставку на устройстве и перезапустил
Брэндон Сёрен Калли
Есть ли способ разделить его, например, 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
raulicious
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 = "портрет"

Итак, полный пример может выглядеть так:

 <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, хотите изменить в файле plist https://www.reddit.com/r/reactnative/comments/7vkrfp/disables_screen_rotate_in_react_native_both/

IOS:

<key>UISupportedInterfaceOrientations</key> <array> <string>UIInterfaceOrientationPortrait</string> <string>UIInterfaceOrientationPortraitUpsideDown</string> </array>
Равиндра
источник
1
Ссылка на решение приветствуется, но убедитесь, что ваш ответ полезен и без нее: добавьте контекст вокруг ссылки чтобы ваши друзья-пользователи имели некоторое представление о том, что это такое и почему оно есть, а затем процитируйте наиболее релевантную часть страницы, которую вы ' повторная ссылка на, если целевая страница недоступна. Ответы, которые представляют собой не более чем ссылку, могут быть удалены.
двойной звуковой сигнал
0

Вы можете использовать модуль и функцию react-native-Ориентация-шкафчикlockToPortrait() .
Это может быть полезно, если вы также хотите иметь некоторые экраны с разблокированной ориентацией - в этом случае вы также можете использовать unlockAllOrientations()функцию.

Филип Квятковски
источник
-3

Если вы используете проект RN expo, а приложение содержит реагирующую навигацию, то настройка навигации по следующему коду мне помогла.

const AppNavigator = createStackNavigator(
{
    Page1: { screen: Page1}
},
{
    portraitOnlyMode: true
});
Манодж
источник