bagaimana cara menonaktifkan rotasi di React Native?

104

Saya hanya ingin mendukung tampilan potret. Bagaimana cara membuat aplikasi React Native tidak melakukan rotasi otomatis? Saya mencoba mencari dokumentasi dan masalah Github, tetapi saya tidak menemukan apa pun yang membantu.

syg
sumber
Tidak bisakah Anda menyetel orientasi yang didukung di properti aplikasi (sama seperti dengan aplikasi iOS lainnya)?
Thilo
8
Bagaimana dengan Android?
ooolala
2
@ooolala jawaban dalam jawaban SO ini stackoverflow.com/questions/34078354/…
MonkeyBonkey
CATATAN: Di MOTO 4 saya, saya tidak bisa sensorPortraitbekerja dengan baik. Itu tidak akan pernah mendukung Potret terbalik (yaitu reversePortrait). Namun, menggunakan fullSensorberhasil tetapi memiliki peringatan juga memungkinkan lanskap. Itu akhirnya baik-baik saja bagi saya tetapi jika Anda hanya menginginkan portraitdan reversePortrait, Anda dapat menghalangi perubahan orientasi dalam Aktivitas Anda dengan onConfigurationChangeddan newConfig.orientationdan mengabaikan atau menimpa perubahan lanskap.
Joshua Pinter

Jawaban:

133

Aplikasi React Native adalah aplikasi iOS biasa, jadi Anda dapat melakukannya dengan cara yang persis sama seperti yang Anda lakukan untuk semua aplikasi lain. Cukup hapus centang (di XCode) "Lanskap Kiri" dan "Lanskap Kanan" sebagaimana diizinkan Orientasi Perangkat di properti aplikasi Umum:

Orientasi perangkat

Jarek Potiuk
sumber
Terima kasih! satu pertanyaan lagi, saya periksa portraitdan upside down, tetapi aplikasi saya tidak berputar otomatis ketika saya memutar layar simulator (90 derajat dua kali), apa masalahnya?
syg
Sudah coba. Sepertinya tidak berfungsi dengan RN 34 saat menjalankan simulator iPad (Pro). Namun, itu berfungsi saat menjalankan simulator iPhone. Saya membutuhkannya untuk bekerja di iPad. Aneh.
Pedram
1
Ternyata saya perlu mengatur "Perangkat" sebagai iPad dan bukan "Universal" seperti sebelumnya. Itu membuatnya berhasil.
Pedram
Mr @Jarek Potiuk saya memiliki sedikit keraguan, sebenarnya ketika saya menjalankan simulater saya secara default menunjukkan kode lanskap, saya telah menggunakan lanskap kiri & kanan. Tapi, saat ini tidak menampilkan mode lansekap di perangkat. saya menggunakan modul orientasi bereaksi asli dan di xcode pilih lanskap kiri & kanan. tapi, saya tidak mengerti
Lavaraju
2
Ini tidak berfungsi untuk beberapa alasan lagi. Setidaknya tidak direact-native 0.45.1
MattyK14
79

Untuk iOS, jawaban Jarek bagus.

Untuk Android, Anda perlu mengedit file AndroidManifest.xml. Tambahkan baris berikut ke setiap aktivitas yang ingin Anda kunci ke mode potret:

android:screenOrientation="portrait" 

Jadi, contoh lengkapnya mungkin terlihat seperti ini:

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

Lihat daftar lengkap properti screenOrientation yang tersedia di dokumen, di sini: https://developer.android.com/guide/topics/manifest/activity-element.html

Jim Wilson
sumber
2
Ini bekerja dengan sempurna. Hanya untuk kepentingan orang lain yang menggunakan VS Code: jalankan 'Jalankan Android di Perangkat / Simulator' dari 'Command Palette ...'. Menggoyangkan perangkat untuk 'memuat ulang' aplikasi tidak akan berfungsi.
Rishi
66

Pembaruan 2017: {"orientation": "portrait"}

Saat ini banyak panduan resmi React Native seperti ini yang merekomendasikan penggunaan Expo saat membuat aplikasi React Native jadi selain jawaban yang ada, saya juga akan menambahkan solusi khusus Expo yang perlu diperhatikan karena berfungsi untuk iOS dan Android dan Anda hanya perlu setel sekali tanpa perlu mengacaukan konfigurasi XCode, AndroidManifest.xml, dll.

Mengatur orientasi pada waktu pembuatan:

Jika Anda membuat aplikasi React Native dengan Expo, Anda dapat menggunakan kolom orientationdi app.jsonfile Anda - misalnya:

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

Dapat disetel ke "portrait", "landscape"atau "default"yang artinya rotasi otomatis tanpa kunci orientasi.

Mengatur orientasi saat runtime:

Anda juga dapat mengganti pengaturan itu pada waktu proses dengan menjalankan, misalnya:

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

dimana argumennya bisa:

  • ALL - Semua 4 kemungkinan orientasi
  • ALL_BUT_UPSIDE_DOWN - Semua kecuali potret terbalik, bisa jadi semua 4 orientasi pada perangkat Android tertentu.
  • PORTRAIT - Orientasi potret, bisa juga potret terbalik pada perangkat Android tertentu.
  • PORTRAIT_UP - Potret terbalik saja.
  • PORTRAIT_DOWN - Hanya potret terbalik.
  • LANDSCAPE - Semua orientasi lanskap.
  • LANDSCAPE_LEFT - Hanya lanskap kiri.
  • LANDSCAPE_RIGHT - Pemandangan yang tepat saja.

Mendeteksi rotasi:

Jika Anda mengizinkan lebih dari satu orientasi, Anda dapat mendeteksi perubahan dengan mendengarkan changekejadian pada Dimensionsobjek:

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

atau Anda juga bisa mendapatkan dimensi kapan saja dengan Dimensions.get('window')dan Dimensions.get('screen')seperti ini:

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

atau:

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

Ketika Anda mendengarkan acara, Anda mendapatkan keduanya windowdan screenpada saat yang sama sehingga Anda mengaksesnya secara berbeda.

Dokumentasi:

Untuk info lebih lanjut lihat:

rsp
sumber
2
berfungsi setelah saya menutup pameran pada perangkat dan meluncurkan kembali
Brandon Søren Culley
Apakah ada cara untuk memisahkannya, Seperti Ipad mengizinkan potret lanskap dan Iphone saja?
7urkm3n
Ini adalah solusi yang berhasil dalam kasus saya. Tampilan utama saya melakukan rotasi 180 derajat setelah menutup iklan pengantara. Jadi saya harus membuat kode keras Expo.ScreenOrientation.allowAsync (Expo.ScreenOrientation.Orientation.LANDSCAPE_LEFT);
Hermann Schwarz
15

Answer for disable rotation in React Native.

For Android :

Buka file Androidmenifest.xml dan tambahkan satu baris: 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 :

Sederhana, Anda harus memeriksa atau menghapus centang mode rotasi dari XCODE Anda

masukkan deskripsi gambar di sini

ANKIT-DETROJA
sumber
2
Jawaban terbaik pada tahun 2020, yang mencakup iOS dan Android
pedas
3

Jika Anda menggunakan Expo, Anda dapat melakukannya hanya dengan kode ini:

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

Taruh di App.js sebelum render

Semua opsi:

ALL ALL_BUT_UPSIDE_DOWN PORTRAIT PORTRAIT_UP PORTRAIT_DOWN LANDSCAPE LANDSCAPE_LEFT LANDSCAPE_RIGHT

Idan
sumber
2

Untuk Android, Anda perlu mengedit file AndroidManifest.xml. Tambahkan baris berikut ke setiap aktivitas yang ingin Anda kunci ke mode potret:

android: screenOrientation = "portrait"

Jadi, contoh lengkapnya mungkin terlihat seperti ini:

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

Untuk Android: Dalam file manifes Anda, letakkan:

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

Kemudian di dalam tag aplikasi, letakkan:

tools:ignore="LockedOrientationActivity"

Dan kemudian di semua set aktivitas:

android:screenOrientation="portrait"
Ankit Adlakha
sumber
1

gunakan ini untuk masalah orientasi ios ipad ingin mengubah file 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>
Ravindra
sumber
1
Tautan ke solusi diperbolehkan, tetapi harap pastikan jawaban Anda berguna tanpanya: tambahkan konteks di sekitar tautan sehingga sesama pengguna Anda akan tahu apa itu dan mengapa itu ada, lalu kutip bagian paling relevan dari halaman Anda ' menautkan ulang jika halaman target tidak tersedia. Jawaban yang tidak lebih dari sebuah tautan dapat dihapus.
bip ganda
0

Anda dapat menggunakan modul dan fungsi react-native-orientasi-lockerlockToPortrait() .
Ini dapat membantu jika Anda juga ingin memiliki beberapa layar dengan orientasi tidak terkunci - dalam hal ini Anda juga dapat menggunakan unlockAllOrientations()fungsi.

Filip Kwiatkowski
sumber
-3

Jika Anda menggunakan proyek RN expo, dan aplikasi berisi navigasi-reaksi, maka pengaturan navigasi ke kode berikut membantu saya.

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