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.

syg
źródło
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

Jarek Potiuk
źródło
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

Jim Wilson
źródło
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:

rsp
źródło
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

ANKIT-DETROJA
źródło
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

Idan
źródło
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>
Paresh Chavda
źródło
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"
Ankit Adlakha
źródło
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>
Ravindra
źródło
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.

Filip Kwiatkowski
źródło
-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
});
Manoj
źródło