làm cách nào để tắt xoay vòng trong React Native?


104

Tôi chỉ muốn hỗ trợ chế độ xem chân dung. Làm cách nào để tạo một ứng dụng React Native không tự động chạy? Tôi đã thử tìm kiếm tài liệu và các vấn đề trên Github, nhưng tôi không tìm thấy bất kỳ điều gì hữu ích.


Bạn không thể chỉ đặt các hướng được hỗ trợ trong thuộc tính ứng dụng (giống như với bất kỳ ứng dụng iOS nào khác)?
Thilo

8
Còn Android thì sao?
ooolala

2
@ooolala câu trả lời trong câu trả lời SO này stackoverflow.com/questions/34078354/…
MonkeyBonkey

LƯU Ý: Trên MOTO 4 của tôi, tôi không thể sensorPortraithoạt động bình thường. Nó sẽ không bao giờ hỗ trợ tính năng Portrait lộn ngược (tức là reversePortrait). Tuy nhiên, sử dụng fullSensorđã làm việc nhưng nó có cảnh báo cũng cho phép cảnh quan. Điều đó kết thúc tốt cho tôi nhưng nếu bạn chỉ muốn portraitreversePortrait, bạn có thể chặn thay đổi hướng trong Hoạt động của mình bằng onConfigurationChangednewConfig.orientationvà chỉ cần bỏ qua hoặc ghi đè các thay đổi ngang.
Joshua Pinter

Câu trả lời:


133

Ứng dụng React Native gần như chỉ là một ứng dụng iOS bình thường, vì vậy bạn có thể làm điều đó theo cách giống hệt như cách làm với tất cả các ứng dụng khác. Chỉ cần bỏ chọn (trong XCode) "Ngang trái" và "Ngang phải" như Hướng thiết bị được phép trong thuộc tính ứng dụng Chung:

Hướng thiết bị


cám ơn! một câu hỏi nữa, tôi đã kiểm tra portraitupside down, nhưng ứng dụng của tôi không tự động xoay khi tôi xoay màn hình của trình mô phỏng (90 độ hai lần), vấn đề là gì?
syg

Đã thử điều đó. Dường như không hoạt động với RN 34 khi chạy trên trình mô phỏng iPad (Pro). Tuy nhiên, nó hoạt động khi chạy trên trình mô phỏng iPhone. Tôi cần nó để hoạt động trên iPad. Thật kỳ lạ.
Pedram,

1
Hóa ra tôi cần đặt "Thiết bị" là iPad chứ không phải "Phổ thông" như trước đây. Điều đó đã làm cho nó hoạt động.
Pedram

Mr @Jarek Potiuk Tôi có một chút nghi ngờ, thực sự khi tôi chạy trình mô phỏng của tôi mặc định hiển thị chế độ cảnh quan, tôi đã sử dụng cảnh quan & phải. nhưng, ngay từ bây giờ nó không hiển thị chế độ ngang trong thiết bị. tôi đang sử dụng mô-đun định hướng gốc phản ứng và trong xcode chọn ngang trái & phải. nhưng, tôi không hiểu
Lavaraju

2
Điều này không hoạt động vì một số lý do nữa. Ít nhất là không trongreact-native 0.45.1
MattyK14

79

Đối với iOS, câu trả lời của Jarek là rất tốt.

Đối với Android, bạn cần chỉnh sửa tệp AndroidManifest.xml. Thêm dòng sau vào từng hoạt động mà bạn muốn khóa ở chế độ dọc:

android:screenOrientation="portrait" 

Vì vậy, một ví dụ đầy đủ có thể trông như thế này:

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

Xem danh sách đầy đủ các thuộc tính screenOrientation có sẵn trong tài liệu, tại đây: https://developer.android.com/guide/topics/manifest/activity-element.html


2
Điều này đã hoạt động hoàn hảo. Chỉ vì lợi ích của những người khác đang sử dụng VS Code: thực thi 'Chạy Android trên Thiết bị / Trình mô phỏng' từ 'Bảng lệnh ...'. Lắc thiết bị để 'Tải lại' ứng dụng sẽ không hoạt động.
Rishi

66

Cập nhật năm 2017: {"orientation": "portrait"}

Hiện tại, nhiều hướng dẫn chính thức về React Native như hướng dẫn này khuyên bạn nên sử dụng Expo khi xây dựng ứng dụng React Native, vì vậy ngoài các câu trả lời hiện có, tôi cũng sẽ thêm một giải pháp dành riêng cho Expo đáng chú ý vì nó hoạt động cho cả iOS và Android và bạn chỉ cần đặt nó một lần mà không cần phải gây rối với cấu hình XCode, AndroidManifest.xml, v.v.

Đặt định hướng tại thời điểm xây dựng:

Nếu bạn đang xây dựng ứng dụng React Native bằng Expo thì bạn có thể sử dụng orientationtrường trong app.jsontệp của mình - ví dụ:

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

Nó có thể được đặt thành "portrait", "landscape"hoặc "default"có nghĩa là tự động xoay mà không có khóa định hướng.

Đặt định hướng trong thời gian chạy:

Bạn cũng có thể ghi đè cài đặt đó trong thời gian chạy bằng cách chạy, ví dụ:

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

nơi đối số có thể là:

  • ALL - Tất cả 4 hướng có thể
  • ALL_BUT_UPSIDE_DOWN - Tất cả trừ dọc ngược, có thể là cả 4 hướng trên các thiết bị Android nhất định.
  • PORTRAIT - Hướng dọc, cũng có thể là dọc ngược trên một số thiết bị Android.
  • PORTRAIT_UP - Chỉ ảnh chân dung ngược.
  • PORTRAIT_DOWN - Chỉ ảnh chân dung lộn ngược.
  • LANDSCAPE - Bất kỳ hướng cảnh quan nào.
  • LANDSCAPE_LEFT - Chỉ còn lại phong cảnh.
  • LANDSCAPE_RIGHT - Đúng cảnh quan.

Phát hiện vòng quay:

Khi bạn cho phép nhiều hơn một hướng thì bạn có thể phát hiện các thay đổi bằng cách lắng nghe các changesự kiện trên Dimensionsđối tượng:

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

hoặc bạn cũng có thể chỉ nhận các thứ nguyên bất cứ lúc nào với Dimensions.get('window')Dimensions.get('screen')như thế này:

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

hoặc là:

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

Khi bạn lắng nghe sự kiện, bạn nhận được cả hai windowscreencùng một lúc, đó là lý do tại sao bạn truy cập nó theo cách khác.

Tài liệu:

Để biết thêm thông tin, hãy xem:


2
công trình sau khi tôi đóng hội chợ trên thiết bị và khởi động lại
Brandon Søren Culley

Có cách nào để tách nó ra, Giống như Ipad cho phép phong cảnh và Iphone chỉ cho phép chân dung?
7urkm3n

Đây là giải pháp hiệu quả trong trường hợp của tôi. Chế độ xem chính của tôi thực hiện xoay 180 độ sau khi đóng quảng cáo xen kẽ. Vì vậy, tôi nên tạo một Expo.ScreenOrientation.allowAsync được mã hóa cứng (Expo.ScreenOrientation.Orientation.LANDSCAPE_LEFT);
Hermann Schwarz

15

Answer for disable rotation in React Native.

For Android :

Đi tới tệp Androidmenifest.xml và thêm một dòng: android: screenOrientation = "chân dung"

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

Đơn giản, bạn phải kiểm tra hoặc bỏ chọn chế độ xoay từ XCODE của mình

nhập mô tả hình ảnh ở đây


2
Câu trả lời tốt nhất trong năm 2020, mà bao gồm cả iOS và Android
raulicious

3

Nếu bạn sử dụng Expo, bạn có thể làm điều đó đơn giản với mã này:

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

Đặt nó trên App.js trước khi kết xuất

Tất cả các tùy chọn:

ALL ALL_BUT_UPSIDE_DOWN PORTRAIT PORTRAIT_UP PORTRAIT_DOWN LANDSCAPE LANDSCAPE_LEFT LANDSCAPE_RIGHT


2

Đối với Android, bạn cần chỉnh sửa tệp AndroidManifest.xml. Thêm dòng sau vào từng hoạt động mà bạn muốn khóa ở chế độ dọc:

android: screenOrientation = "chân dung"

Vì vậy, một ví dụ đầy đủ có thể trông như thế này:

 <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

Đối với Android: Trong tệp kê khai của bạn đặt:

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

Sau đó, bên trong thẻ ứng dụng đặt:

tools:ignore="LockedOrientationActivity"

Và sau đó trong tất cả các tập hợp hoạt động:

android:screenOrientation="portrait"

1

sử dụng cái này cho ios ipad orientaion vấn đề muốn thay đổi trong tệp 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
Liên kết đến một giải pháp được hoan nghênh, nhưng hãy đảm bảo rằng câu trả lời của bạn hữu ích nếu không có nó: thêm ngữ cảnh xung quanh liên kết để những người dùng đồng nghiệp của bạn sẽ biết nó là gì và tại sao nó ở đó, sau đó trích dẫn phần có liên quan nhất của trang bạn ' đang liên kết lại trong trường hợp trang đích không có sẵn. Các câu trả lời ít hơn một liên kết có thể bị xóa.
tiếng bíp kép

0

Bạn có thể sử dụng mô-đun và chức năng react-native-direction-lockerlockToPortrait() .
Điều này có thể hữu ích nếu bạn cũng muốn có một số màn hình có hướng mở khóa - trong trường hợp này, bạn cũng có thể sử dụngunlockAllOrientations() chức năng.


-3

Nếu bạn đang sử dụng dự án RN expo và ứng dụng chứa điều hướng phản ứng, thì việc thiết lập điều hướng theo mã sau đã giúp tôi.

const AppNavigator = createStackNavigator(
{
    Page1: { screen: Page1}
},
{
    portraitOnlyMode: true
});
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.