วิธีปิดการหมุนใน React Native


104

ฉันต้องการสนับสนุนเฉพาะมุมมองแนวตั้งเท่านั้น ฉันจะสร้างแอป React Native ไม่ให้หมุนอัตโนมัติได้อย่างไร ฉันพยายามค้นหาเอกสารและปัญหา Github แต่ไม่พบสิ่งใดที่เป็นประโยชน์


คุณไม่สามารถตั้งค่าการวางแนวที่รองรับในคุณสมบัติของแอปพลิเคชัน (เช่นเดียวกับแอป iOS อื่น ๆ ) ได้หรือไม่?
Thilo

8
แล้ว Android ล่ะ?
ooolala

2
คำตอบของ @ooolala ใน SO คำตอบนี้stackoverflow.com/questions/34078354/…
MonkeyBonkey

หมายเหตุ: ใน MOTO 4 ของฉันฉันไม่sensorPortraitสามารถทำงานได้อย่างถูกต้อง มันจะไม่รองรับภาพบุคคลแบบกลับหัว (เช่นreversePortrait) อย่างไรก็ตามการใช้fullSensorงานได้ผล แต่ก็มีข้อแม้ในการให้ภูมิทัศน์ ที่จบลงด้วยการที่ดีสำหรับฉัน แต่ถ้าคุณต้องการเท่านั้นportraitและreversePortraitคุณสามารถสกัดกั้นการเปลี่ยนแปลงการวางแนวทางในกิจกรรมของคุณด้วยonConfigurationChangedและnewConfig.orientationและเพียงไม่สนใจหรือการเปลี่ยนแปลงภูมิทัศน์แทนที่
Joshua Pinter

คำตอบ:


132

แอป React Native เป็นเพียงแอปพลิเคชัน iOS ทั่วไปดังนั้นคุณสามารถทำได้ในลักษณะเดียวกับที่คุณทำกับแอปอื่น ๆ ทั้งหมด เพียงแค่ยกเลิกการเลือก (ใน XCode) "แนวนอนด้านซ้าย" และ "แนวนอนขวา" ตามที่อนุญาตการวางแนวอุปกรณ์ในคุณสมบัติแอปพลิเคชันทั่วไป:

การวางแนวอุปกรณ์


ขอบคุณ! อีกหนึ่งคำถามฉันจะตรวจสอบportraitและupside downแต่ app ของฉันไม่ได้ autorotate เมื่อฉันหมุนหน้าจอจำลองของ (90 องศาสอง) สิ่งที่เป็นปัญหาหรือไม่
syg

พยายามแล้ว ดูเหมือนจะไม่ทำงานกับ RN 34 เมื่อทำงานบนโปรแกรมจำลอง iPad (Pro) อย่างไรก็ตามมันใช้งานได้เมื่อทำงานบนเครื่องจำลอง iPhone ฉันต้องการให้มันทำงานบน iPad ได้ แปลก.
Pedram

1
ปรากฎว่าฉันต้องตั้งค่า "อุปกรณ์" เป็น iPad ไม่ใช่ "สากล" เหมือนเมื่อก่อน นั่นทำให้มันใช้งานได้
Pedram

Mr @Jarek Potiuk ฉันมีข้อสงสัยเล็กน้อยจริงๆแล้วตอนที่ฉันเรียกใช้ตัวจำลองของฉันโดยปริยายจะแสดงโหมดภูมิทัศน์ฉันได้ใช้ landscapeleft & right แต่ตอนนี้มันไม่แสดงโหมดแนวนอนในอุปกรณ์ ฉันกำลังใช้โมดูลการวางแนวตอบสนองดั้งเดิมและใน xcode เลือกแนวนอนซ้ายและขวา แต่ฉันไม่เข้าใจ
Lavaraju

2
วิธีนี้ใช้ไม่ได้ด้วยเหตุผลบางประการอีกต่อไป อย่างน้อยก็ไม่ใช่react-native 0.45.1
MattyK14

78

สำหรับ iOS คำตอบของ Jarek นั้นยอดเยี่ยมมาก

สำหรับ 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 Code: เรียกใช้ 'Run Android on Device / Simulator' จาก 'Command Palette ... ' การเขย่าอุปกรณ์เพื่อ "โหลดซ้ำ" แอปจะไม่ทำงาน
Rishi

65

อัปเดต 2017: {"orientation": "portrait"}

ปัจจุบันคำแนะนำ React Native อย่างเป็นทางการจำนวนมากเช่นนี้แนะนำให้ใช้ Expo เมื่อสร้างแอป React Native ดังนั้นนอกเหนือจากคำตอบที่มีอยู่แล้วฉันยังจะเพิ่มโซลูชันเฉพาะงาน Expo ซึ่งเป็นที่น่าสังเกตเพราะใช้ได้กับทั้ง iOS และ Android และคุณจะต้องทำเท่านั้น ตั้งค่าได้ครั้งเดียวโดยไม่ต้องวุ่นวายกับ XCode config, 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"ซึ่งหมายถึงการที่มีการล็อค autorotate ปฐมนิเทศไม่มี

การตั้งค่าการวางแนวที่รันไทม์:

คุณยังสามารถแทนที่การตั้งค่านั้นในรันไทม์ได้ด้วยการรันตัวอย่างเช่น:

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);
Hermann Schwarz

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 orientaion ต้องการเปลี่ยนในไฟล์ 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>

1
ยินดีต้อนรับลิงก์ไปยังโซลูชัน แต่โปรดตรวจสอบให้แน่ใจว่าคำตอบของคุณมีประโยชน์หากไม่มีมัน: เพิ่มบริบทรอบ ๆ ลิงก์เพื่อให้เพื่อนผู้ใช้ของคุณได้ทราบว่ามันคืออะไรและทำไมจึงอยู่ที่นั่นจากนั้นจึงอ้างถึงส่วนที่เกี่ยวข้องที่สุดของเพจที่คุณ ' เชื่อมโยงใหม่ในกรณีที่หน้าเป้าหมายไม่พร้อมใช้งาน คำตอบที่มากกว่าลิงก์เพียงเล็กน้อยอาจถูกลบ
เสียงบี๊บสองครั้ง

0

คุณสามารถใช้โมดูลและฟังก์ชันการตอบสนองแบบเนทีฟ - ปฐมนิเทศล็อกเกอร์ สิ่งนี้จะมีประโยชน์หากคุณต้องการให้หน้าจอบางส่วนมีการวางแนวแบบปลดล็อก - ในกรณีนี้คุณสามารถใช้ฟังก์ชันได้เช่นกันlockToPortrait()
unlockAllOrientations()


-3

หากคุณกำลังใช้โครงการ RN expo และแอปมีการนำทางแบบตอบสนองการตั้งค่าการนำทางไปยังรหัสต่อไปนี้ช่วยฉันได้

const AppNavigator = createStackNavigator(
{
    Page1: { screen: Page1}
},
{
    portraitOnlyMode: true
});
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.