jak wyłączyć rotację w React Native?


104

Chciałbym obsługiwać tylko widok pionowy. Jak mogę sprawić, by aplikacja React Native nie obracała się automatycznie? Próbowałem przeszukać dokumentację i problemy z Githubem, ale nie znalazłem nic pomocnego.


Nie możesz po prostu ustawić obsługiwanych orientacji we właściwościach aplikacji (tak samo jak w przypadku każdej innej aplikacji na iOS)?
Thilo

8
A co z Androidem?
ooolala

2
@ooolala odpowiedź w tej SO answer stackoverflow.com/questions/34078354/…
MonkeyBonkey

UWAGA: W moim MOTO 4 nie mogłem sensorPortraitpoprawnie pracować. Nigdy nie będzie obsługiwać odwróconego portretu (tj reversePortrait.). Jednak użycie fullSensordziałało, ale wiązało się z zastrzeżeniem, że pozwalało również na krajobraz. Skończyło się na tym, że dla mnie było w porządku, ale jeśli tylko chcesz portraiti reversePortraitmożesz przechwycić zmianę orientacji w swojej Aktywności za pomocą onConfigurationChangedi newConfig.orientationi po prostu zignorować lub nadpisać zmiany krajobrazu.
Joshua Pinter

Odpowiedzi:


133

Aplikacja React Native to w zasadzie zwykła aplikacja na iOS, więc możesz to zrobić dokładnie w taki sam sposób, jak w przypadku wszystkich innych aplikacji. Po prostu odznacz (w XCode) „Poziomo po lewej” i „Poziomo po prawej” jako dozwolone Orientacje urządzenia we właściwościach ogólnych aplikacji:

Orientacja urządzenia


dzięki! jeszcze jedno pytanie, sprawdziłem portraiti upside down, ale moja aplikacja nie obracała się automatycznie po obróceniu ekranu symulatora (dwukrotnie o 90 stopni), w czym problem?
syg

Próbowałem tego. Wydaje się, że nie działa z RN 34 podczas pracy na symulatorze iPada (Pro). Działa jednak na symulatorze iPhone'a. Potrzebuję go jednak do pracy na iPadzie. Dziwne.
Pedram

1
Okazuje się, że muszę ustawić „Urządzenia” jako iPad, a nie „Uniwersalne”, jak to było wcześniej. To sprawiło, że to zadziałało.
Pedram

Panie @Jarek Potiuk mam małą wątpliwość, właściwie, kiedy zostałem uruchomiony, mój symulator domyślnie pokazuje tryb krajobrazu, użyłem landscapeleft & right. ale teraz nie pokazuje trybu poziomego w urządzeniu. Używam modułu reaktywnej orientacji iw xcode wybierz poziomo lewy i prawy. ale nie dostałem
Lavaraju

2
To już nie działa z jakiegoś powodu. Przynajmniej nie wreact-native 0.45.1
MattyK14

79

W przypadku iOS odpowiedź Jarka jest świetna.

W przypadku Androida musisz edytować plik AndroidManifest.xml. Dodaj następujący wiersz do każdego działania, które chcesz zablokować w trybie portretowym:

android:screenOrientation="portrait" 

Tak więc pełny przykład może wyglądać następująco:

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

Zobacz pełną listę dostępnych właściwości screenOrientation w dokumentacji, tutaj: https://developer.android.com/guide/topics/manifest/activity-element.html


2
To działało doskonale. Tylko dla korzyści innych, którzy używają VS Code: wykonaj „Uruchom Androida na urządzeniu / symulatorze” z „Palety poleceń…”. Potrząsanie urządzeniem w celu ponownego załadowania aplikacji nie zadziała.
Rishi

66

Aktualizacja 2017: {"orientation": "portrait"}

Obecnie wiele oficjalnych przewodników po React Native, takich jak ten, zaleca używanie Expo podczas tworzenia aplikacji React Native, więc oprócz istniejących odpowiedzi dodam również rozwiązanie specyficzne dla Expo, które jest warte odnotowania, ponieważ działa zarówno na iOS, jak i Android i wystarczy ustaw go raz, bez konieczności majstrowania przy konfiguracji XCode, AndroidManifest.xml itp.

Ustawianie orientacji w czasie kompilacji:

Jeśli tworzysz swoje aplikacje React Native za pomocą Expo, możesz użyć orientationpola w swoim app.jsonpliku - na przykład:

{
  "expo": {
    "name": "My app",
    "slug": "my-app",
    "sdkVersion": "21.0.0",
    "privacy": "public",
    "orientation": "portrait"
  }
}

To może być ustawiony "portrait", "landscape"albo "default"co oznacza AutoRotate bez blokady orientacji.

Ustawianie orientacji w czasie wykonywania:

Możesz również zastąpić to ustawienie w czasie wykonywania, uruchamiając na przykład:

Expo.ScreenOrientation.allow(Expo.ScreenOrientation.Orientation.LANDSCAPE);

gdzie argumentem może być:

  • ALL - Wszystkie 4 możliwe orientacje
  • ALL_BUT_UPSIDE_DOWN - Wszystkie oprócz odwróconego portretu mogą mieć wszystkie 4 orientacje na niektórych urządzeniach z Androidem.
  • PORTRAIT - Orientacja pionowa, może być również odwrócona w pionie na niektórych urządzeniach z Androidem.
  • PORTRAIT_UP - Tylko portret do góry nogami.
  • PORTRAIT_DOWN - Tylko portret do góry nogami.
  • LANDSCAPE - Dowolna orientacja pozioma.
  • LANDSCAPE_LEFT - Tylko lewy poziom.
  • LANDSCAPE_RIGHT - Tylko prawy krajobraz.

Wykrywanie obrotu:

Jeśli zezwolisz na więcej niż jedną orientację, możesz wykryć zmiany, nasłuchując changezdarzeń na Dimensionsobiekcie:

Dimensions.addEventListener('change', (dimensions) => {
  // you get:
  //  dimensions.window.width
  //  dimensions.window.height
  //  dimensions.screen.width
  //  dimensions.screen.height
});

lub możesz po prostu uzyskać wymiary w dowolnym momencie za pomocą Dimensions.get('window')i w Dimensions.get('screen')ten sposób:

const dim = Dimensions.get('window');
// you get:
//  dim.width
//  dim.height

lub:

const dim = Dimensions.get('screen');
// you get:
//  dim.width
//  dim.height

Kiedy słuchasz wydarzenia, dostajesz jedno windowi drugie screenw tym samym czasie, dlatego masz do niego inny dostęp.

Dokumentacja:

Więcej informacji:


2
działa po zamknięciu wystawy na urządzeniu i ponownym uruchomieniu
Brandon Søren Culley

Czy jest sposób, aby to oddzielić, tak jak Ipad pozwala tylko na orientację poziomą, a iPhone na portret?
7urkm3n

To jest rozwiązanie, które działa w moim przypadku. Mój widok główny to obrót o 180 stopni po zamknięciu reklamy pełnoekranowej. Powinienem więc zrobić zakodowany na stałe Expo.ScreenOrientation.allowAsync (Expo.ScreenOrientation.Orientation.LANDSCAPE_LEFT);
Hermann Schwarz

15

Answer for disable rotation in React Native.

For Android :

Przejdź do pliku Androidmenifest.xml i dodaj jedną linię: 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 :

Po prostu musisz zaznaczyć lub odznaczyć tryb rotacji w swoim XCODE

wprowadź opis obrazu tutaj


2
Najlepsza odpowiedź w 2020 roku, która obejmuje zarówno iOS, jak i Androida
raulicious

3

Jeśli korzystasz z Expo, możesz to zrobić po prostu za pomocą tego kodu:

Expo.ScreenOrientation.allow(Expo.ScreenOrientation.Orientation.PORTRAIT);

Umieść go w App.js przed renderowaniem

Wszystkie opcje:

ALL ALL_BUT_UPSIDE_DOWN PORTRAIT PORTRAIT_UP PORTRAIT_DOWN LANDSCAPE LANDSCAPE_LEFT LANDSCAPE_RIGHT


2

W przypadku Androida musisz edytować plik AndroidManifest.xml. Dodaj następujący wiersz do każdego działania, które chcesz zablokować w trybie portretowym:

android: screenOrientation = "portret"

Tak więc pełny przykład może wyglądać następująco:

 <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: w pliku manifestu umieść:

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

Następnie wewnątrz tagu aplikacji umieść:

tools:ignore="LockedOrientationActivity"

A potem w całym zestawie czynności:

android:screenOrientation="portrait"

1

użyj tego w przypadku problemu z orientacją na ios ipad chcesz zmienić w pliku plist https://www.reddit.com/r/reactnative/comments/7vkrfp/disecting_screen_rotate_in_react_native_both/

IOS:

<key>UISupportedInterfaceOrientations</key> <array> <string>UIInterfaceOrientationPortrait</string> <string>UIInterfaceOrientationPortraitUpsideDown</string> </array>

1
Link do rozwiązania jest mile widziany, ale upewnij się, że Twoja odpowiedź jest przydatna bez niego: dodaj kontekst wokół linku, aby inni użytkownicy mieli pojęcie, co to jest i dlaczego się tam znajduje, a następnie zacytuj najbardziej odpowiednią część strony, którą podałeś. ponowne łącze w przypadku, gdy strona docelowa jest niedostępna. Odpowiedzi, które są niewiele więcej niż linkiem, mogą zostać usunięte.
podwójny sygnał dźwiękowy

0

Możesz użyć modułu i funkcji React-Native-Orientation-LockerlockToPortrait() .
Może to być pomocne, jeśli chciałbyś mieć również niektóre ekrany z odblokowaną orientacją - w tym przypadku możesz również skorzystać z unlockAllOrientations()funkcji.


-3

Jeśli korzystasz z projektu RN expo, a aplikacja zawiera funkcję reaktywnej nawigacji, pomogło mi skonfigurowanie nawigacji do następującego kodu.

const AppNavigator = createStackNavigator(
{
    Page1: { screen: Page1}
},
{
    portraitOnlyMode: true
});
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.