¿Cómo deshabilitar la rotación en React Native?

104

Me gustaría admitir solo la vista vertical. ¿Cómo puedo hacer que una aplicación React Native no gire automáticamente? Intenté buscar documentación y problemas de Github, pero no encontré nada útil.

syg
fuente
¿No puede simplemente establecer las orientaciones admitidas en las propiedades de la aplicación (igual que con cualquier otra aplicación de iOS)?
Thilo
8
¿Y Android?
ooolala
2
@ooolala responde en esta respuesta SO stackoverflow.com/questions/34078354/…
MonkeyBonkey
NOTA: En mi MOTO 4, no pude ponerme sensorPortraita trabajar correctamente. Nunca admitiría Retrato al revés (es decir reversePortrait). Sin embargo, el uso fullSensorfuncionó, pero tenía la salvedad de permitir también el paisaje. Eso terminó estando bien para mí, pero si solo desea portraity reversePortrait, puede interceptar el cambio de orientación en su Actividad con onConfigurationChangedy newConfig.orientationy simplemente ignorar o anular los cambios de paisaje.
Joshua Pinter

Respuestas:

133

La aplicación React Native es prácticamente una aplicación iOS normal, por lo que puede hacerlo exactamente de la misma manera que lo hace con todas las demás aplicaciones. Simplemente desmarque (en XCode) "Horizontal izquierda" y "Horizontal derecha" como Orientaciones de dispositivo permitidas en las propiedades generales de la aplicación:

Orientación del dispositivo

Jarek Potiuk
fuente
¡Gracias! una pregunta más, verifiqué portraity upside down, pero mi aplicación no giró automáticamente cuando giré la pantalla del simulador (90 grados dos veces), ¿cuál es el problema?
syg
Probé eso. No parece funcionar con RN 34 cuando se ejecuta en un simulador de iPad (Pro). Sin embargo, funciona cuando se ejecuta en un simulador de iPhone. Sin embargo, lo necesito para que funcione en un iPad. Extraño.
Pedram
1
Resulta que necesito configurar "Dispositivos" como iPad y no "Universal" como antes. Eso lo hizo funcionar.
Pedram
Señor @Jarek Potiuk, tengo una pequeña duda, de hecho, cuando se ejecutó mi simulador muestra el modo de paisaje de forma predeterminada, tuve que usar el modo de paisaje izquierdo y derecho. pero, ahora mismo no muestra el modo horizontal en el dispositivo. Estoy usando el módulo de orientación nativa de reacción y en xcode selecciono el paisaje izquierdo y derecho. pero no lo conseguí
Lavaraju
2
Esto ya no funciona por alguna razón. Al menos no enreact-native 0.45.1
MattyK14
79

Para iOS, la respuesta de Jarek es genial.

Para Android, debe editar el archivo AndroidManifest.xml. Agregue la siguiente línea a cada actividad que desee bloquear en modo vertical:

android:screenOrientation="portrait" 

Entonces, un ejemplo completo podría verse así:

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

Consulte la lista completa de propiedades de orientación de pantalla disponibles en los documentos, aquí: https://developer.android.com/guide/topics/manifest/activity-element.html

Jim Wilson
fuente
2
Esto funcionó perfectamente. Solo para el beneficio de otros que están usando VS Code: ejecute 'Ejecutar Android en Dispositivo / Simulador' desde 'Paleta de Comando ...'. Agitar el dispositivo para "Recargar" la aplicación no funcionará.
Rishi
66

Actualización de 2017: {"orientation": "portrait"}

Actualmente, muchas guías oficiales de React Native como esta recomiendan usar Expo al crear aplicaciones React Native, por lo que, además de las respuestas existentes, también agregaré una solución específica de Expo que vale la pena señalar porque funciona tanto para iOS como para Android y solo necesita configúrelo una vez sin necesidad de meterse con la configuración de XCode, AndroidManifest.xml, etc.

Configuración de la orientación en el momento de la construcción:

Si está creando sus aplicaciones React Native con Expo, puede usar el orientationcampo en su app.jsonarchivo, por ejemplo:

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

Se puede configurar en "portrait", "landscape"o lo "default"que significa rotar automáticamente sin bloqueo de orientación.

Configuración de la orientación en tiempo de ejecución:

También puede anular esa configuración en tiempo de ejecución ejecutando, por ejemplo:

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

donde el argumento puede ser:

  • ALL - Las 4 orientaciones posibles
  • ALL_BUT_UPSIDE_DOWN - Todos, excepto el retrato inverso, podrían tener las 4 orientaciones en ciertos dispositivos Android.
  • PORTRAIT - Orientación vertical, también podría ser vertical en ciertos dispositivos Android.
  • PORTRAIT_UP - Solo retrato al revés.
  • PORTRAIT_DOWN - Solo retrato al revés.
  • LANDSCAPE - Cualquier orientación horizontal.
  • LANDSCAPE_LEFT - Solo paisaje izquierdo.
  • LANDSCAPE_RIGHT - Solo paisaje derecho.

Detectando la rotación:

Cuando permite más de una orientación, puede detectar los cambios escuchando los changeeventos en el Dimensionsobjeto:

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

o también puede obtener las dimensiones en cualquier momento con Dimensions.get('window')y Dimensions.get('screen')así:

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

o:

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

Cuando escuchas el evento, obtienes ambos windowy screenal mismo tiempo, por eso accedes a él de manera diferente.

Documentación:

Para obtener más información, consulte:

rsp
fuente
2
funciona después de cerrar la exposición en el dispositivo y relanzarla
Brandon Søren Culley
¿Hay alguna forma de separarlo, como el Ipad permite el paisaje y el Iphone solo el retrato?
7urkm3n
Esta es la solución que funciona en mi caso. Mi vista principal hace una rotación de 180 grados después de cerrar el anuncio intersticial. Así que debería hacer una Expo.ScreenOrientation.allowAsync (Expo.ScreenOrientation.Orientation.LANDSCAPE_LEFT);
Hermann Schwarz
15

Answer for disable rotation in React Native.

For Android :

Vaya al archivo Androidmenifest.xml y agregue una línea: 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 :

Simple, tienes que marcar o desmarcar el modo de rotación de tu XCODE

ingrese la descripción de la imagen aquí

ANKIT-DETROJA
fuente
2
La mejor respuesta en 2020, que cubre tanto iOS como Android
raulicious
3

Si usa Expo, puede hacerlo simplemente con este código:

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

Ponlo en App.js antes de renderizar

Todas las opciones:

ALL ALL_BUT_UPSIDE_DOWN PORTRAIT PORTRAIT_UP PORTRAIT_DOWN LANDSCAPE LANDSCAPE_LEFT LANDSCAPE_RIGHT

Idan
fuente
2

Para Android, debe editar el archivo AndroidManifest.xml. Agregue la siguiente línea a cada actividad que desee bloquear en modo vertical:

android: screenOrientation = "retrato"

Entonces, un ejemplo completo podría verse así:

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

Para Android: en su archivo de manifiesto, ponga:

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

Luego, dentro de la etiqueta de la aplicación, coloque:

tools:ignore="LockedOrientationActivity"

Y luego en todo el conjunto de actividades:

android:screenOrientation="portrait"
Ankit Adlakha
fuente
1

use esto para el problema de orientación de ios ipad desea cambiar en el archivo 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
fuente
1
Un enlace a una solución es bienvenido, pero asegúrese de que su respuesta sea útil sin él: agregue contexto alrededor del enlace para que sus compañeros usuarios tengan una idea de qué es y por qué está allí, luego cite la parte más relevante de la página. está enlazando en caso de que la página de destino no esté disponible Las respuestas que son poco más que un enlace pueden eliminarse.
doble pitido
0

Puede usar el módulo y la función react-native-Orientation-LockerlockToPortrait() .
Esto puede ser útil si también desea tener algunas de las pantallas con orientación desbloqueada; en este caso, también podría usar la unlockAllOrientations()función.

Filip Kwiatkowski
fuente
-3

Si está utilizando el proyecto RN expo y la aplicación contiene react-navigation, entonces me ayudó configurar la navegación en el siguiente código.

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