як відключити обертання в React Native?


104

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


Чи не можете ви просто встановити підтримувані орієнтації у властивостях додатка (як у будь-якому іншому додатку iOS)?
Тіло,

8
Що з Android?
ooolala

2
@ooolala відповідь в цьому SO відповідь stackoverflow.com/questions/34078354 / ...
MonkeyBonkey

ПРИМІТКА. На моєму MOTO 4 я не зміг sensorPortraitнормально працювати. Він ніколи не підтримував би догори ногами Портрет (тобто reversePortrait). Тим fullSensorне менше, використовуючи роботу, але це було також застереженням про те, що також дозволяє ландшафт. Це закінчилося тим , що було добре для мене , але якщо ви тільки хочете , portraitі reversePortraitви можете перехопити зміна орієнтації у вашій діяльності з onConfigurationChangedі newConfig.orientationі просто ігнорувати або зміни перевизначення ландшафту.
Джошуа Пінтер

Відповіді:


133

Додаток React Native - це майже звичайний додаток для iOS, тому ви можете зробити це точно так само, як і для всіх інших додатків. Просто зніміть прапорець (у XCode) "Пейзаж ліворуч" та "Пейзаж праворуч" згідно дозволених орієнтацій пристроїв у Загальних властивостях програми:

Орієнтація пристрою


Дякую! ще одне питання, я перевірив portraitі upside down, але мій додаток не повертався автоматично, коли я повертав екран симулятора (на 90 градусів двічі), у чому проблема?
сиг

Спробував це. Схоже, це не працює з RN 34 під час роботи на тренажері iPad (Pro). Однак це працює під час роботи на тренажері iPhone. Мені це потрібно для роботи на iPad. Дивно.
Педрам

1
Виявляється, мені потрібно встановити "Пристрої" як iPad, а не "Універсальний", як це було раніше. Це змусило його працювати.
Педрам

Г-н @Jarek Potiuk У мене є невеликі сумніви, насправді, коли я запускався, мій симулятор за замовчуванням показує landscapemode, я використовував landscapeleft & right. але, прямо зараз не відображається альбомний режим у пристрої. Я використовую реактивний модуль орієнтації і в 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>

Переглянути повний перелік доступних властивостей екрана орієнтації в документах можна тут: https://developer.android.com/guide/topics/manifest/activity-element.html


2
Це спрацювало чудово. Просто на користь інших, хто використовує код VS: виконайте команду "Запустити 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 - Все, окрім зворотного портрета, може бути в усіх 4 орієнтаціях на певних пристроях 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

Коли ви слухаєте подію, ви отримуєте windowі screenодночасно, і тому ви отримуєте доступ до неї по-різному.

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

Для отримання додаткової інформації див:


2
працює після закриття експозиції на пристрої та відновлення
Brandon Søren Culley

Чи є спосіб її відокремити, як 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 році, яка охоплює i 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 = "портрет"

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

 <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

використовувати це для випуску орієнтації на ipad ipad, хочу змінити файл-список 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
Посилання на рішення вітається, але будь ласка, переконайтеся, що ваша відповідь корисна без неї: додайте контекст навколо посилання, щоб ваші колеги користувачі мали уявлення про те, що це таке і чому воно є, а потім наведіть найвідповіднішу частину сторінки, яку ви ' повторне посилання на випадок, якщо цільова сторінка недоступна. Відповіді, які є трохи більше ніж посилання, можуть бути видалені.
подвійний звуковий сигнал

0

Ви можете використовувати модуль і функціональну функцію -шафка з орієнтацією на реакціюlockToPortrait() .
Це може бути корисно, якщо ви також хочете мати деякі екрани з розблокованою орієнтацією - у цьому випадку ви також можете використовувати unlockAllOrientations()функцію.


-3

Якщо ви використовуєте проект RN expo, а додаток містить реакцію-навігацію, то мені допомогла налаштування навігації до наступного коду.

const AppNavigator = createStackNavigator(
{
    Page1: { screen: Page1}
},
{
    portraitOnlyMode: true
});
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.