como desativar a rotação no React Native?

104

Eu gostaria de oferecer suporte apenas para visualização em retrato. Como posso fazer com que um aplicativo React Native não gire automaticamente? Tentei pesquisar documentação e problemas no Github, mas não encontrei nada útil.

syg
fonte
Você não pode apenas definir as orientações com suporte nas propriedades do aplicativo (o mesmo que com qualquer outro aplicativo iOS)?
Thilo
8
E o Android?
ooolala
2
@ooolala resposta nesta resposta SO stackoverflow.com/questions/34078354/…
MonkeyBonkey
NOTA: No meu MOTO 4, não consegui começar sensorPortraita trabalhar corretamente. Ele nunca suportaria Retrato de cabeça para baixo (ou seja reversePortrait). No entanto, usar fullSensorfuncionou, mas tinha a ressalva de permitir também a paisagem. Isso acabou sendo bom para mim, mas se você quiser apenas portraite reversePortrait, pode interceptar a mudança de orientação em sua atividade com onConfigurationChangede newConfig.orientatione simplesmente ignorar ou substituir as mudanças de paisagem.
Joshua Pinter

Respostas:

133

O aplicativo React Native é basicamente um aplicativo iOS normal, então você pode fazer isso exatamente da mesma forma que faria para todos os outros aplicativos. Simplesmente desmarque (no XCode) "Landscape Left" e "Landscape Right" conforme as Orientações do dispositivo permitidas nas propriedades gerais do aplicativo:

Orientação do dispositivo

Jarek Potiuk
fonte
THX! mais uma pergunta, verifiquei portraite upside down, mas meu aplicativo não girou automaticamente quando giro a tela do simulador (90 graus duas vezes), qual é o problema?
syg
Tentei isso. Não parece funcionar com RN 34 quando executado em um simulador de iPad (Pro). No entanto, funciona quando executado em um simulador de iPhone. Mas preciso que funcione em um iPad. Estranho.
Pedram,
1
Acontece que preciso definir "Dispositivos" como iPad e não "Universal" como era antes. Isso fez funcionar.
Pedram
Sr. @Jarek Potiuk eu tenho uma pequena dúvida, na verdade quando eu estava rodando meu simulador mostra o modo paisagístico padrão, eu usei paisagismo esquerdo e direito. mas, neste momento, não é mostrado o modo paisagem no dispositivo. Estou usando o módulo de orientação nativo Rea e, no xcode, selecione a paisagem à esquerda e à direita. mas não entendi
Lavaraju
2
Isso não funciona mais por algum motivo. Pelo menos não emreact-native 0.45.1
MattyK14
79

Para iOS, a resposta de Jarek é ótima.

Para Android, você precisa editar o arquivo AndroidManifest.xml. Adicione a seguinte linha a cada atividade que você deseja bloquear no modo retrato:

android:screenOrientation="portrait" 

Portanto, um exemplo completo pode ter a seguinte aparência:

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

Veja a lista completa de propriedades screenOrientation disponíveis nos documentos, aqui: https://developer.android.com/guide/topics/manifest/activity-element.html

Jim Wilson
fonte
2
Funcionou perfeitamente. Apenas para o benefício de outras pessoas que estão usando o VS Code: execute 'Run Android on Device / Simulator' em 'Command Palette ...'. Agitar o dispositivo para 'recarregar' o aplicativo não funcionará.
Rishi
66

Atualização de 2017: {"orientation": "portrait"}

Atualmente, muitos guias oficiais do React Native como este recomendam o uso do Expo ao criar aplicativos do React Native, então, além das respostas existentes, também adicionarei uma solução específica da Expo que vale a pena notar porque funciona para iOS e Android e você só precisa configure-o uma vez sem a necessidade de mexer com a configuração do XCode, AndroidManifest.xml etc.

Definir a orientação no momento da construção:

Se você estiver criando seus aplicativos React Native com Expo, poderá usar o orientationcampo em seu app.jsonarquivo - por exemplo:

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

Pode ser definido como "portrait", "landscape"ou o "default"que significa rotação automática sem bloqueio de orientação.

Definir orientação em tempo de execução:

Você também pode substituir essa configuração no tempo de execução executando, por exemplo:

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

onde o argumento pode ser:

  • ALL - Todas as 4 orientações possíveis
  • ALL_BUT_UPSIDE_DOWN - Todos, exceto o retrato reverso, podem ser todas as 4 orientações em determinados dispositivos Android.
  • PORTRAIT - Orientação retrato, também pode ser retrato reverso em certos dispositivos Android.
  • PORTRAIT_UP - Somente retrato de cabeça para baixo.
  • PORTRAIT_DOWN - Retrato de cabeça para baixo apenas.
  • LANDSCAPE - Qualquer orientação de paisagem.
  • LANDSCAPE_LEFT - Apenas paisagem esquerda.
  • LANDSCAPE_RIGHT - Apenas paisagem certa.

Detectando a rotação:

Quando você permite mais de uma orientação, pode detectar as mudanças ouvindo os changeeventos no Dimensionsobjeto:

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

ou você também pode obter as dimensões a qualquer momento com Dimensions.get('window')e Dimensions.get('screen')assim:

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

ou:

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

Quando você ouve o evento, obtém os dois windowe screenao mesmo tempo, por isso o acessa de maneira diferente.

Documentação:

Para obter mais informações, consulte:

rsp
fonte
2
funciona depois que fechei a exposição do dispositivo e reiniciei
Brandon Søren Culley
Existe maneira de separá-lo, como o Ipad permite paisagem e iPhone apenas retrato?
7urkm3n
Essa é a solução que funciona no meu caso. Minha visualização principal faz uma rotação de 180 graus após o fechamento do anúncio intersticial. Portanto, devo fazer um Expo.ScreenOrientation.allowAsync (Expo.ScreenOrientation.Orientation.LANDSCAPE_LEFT) codificado;
Hermann Schwarz
15

Answer for disable rotation in React Native.

For Android :

Vá para o arquivo Androidmenifest.xml e adicione uma linha: 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 :

Simples, você tem que marcar ou desmarcar o modo de rotação do seu XCODE

insira a descrição da imagem aqui

ANKIT-DETROJA
fonte
2
Melhor resposta em 2020, que abrange iOS e Android
raulicious
3

Se você usa Expo, pode fazê-lo simplesmente com este código:

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

Coloque-o em App.js antes de renderizar

Todas as opções:

ALL ALL_BUT_UPSIDE_DOWN PORTRAIT PORTRAIT_UP PORTRAIT_DOWN LANDSCAPE LANDSCAPE_LEFT LANDSCAPE_RIGHT

Idan
fonte
2

Para Android, você precisa editar o arquivo AndroidManifest.xml. Adicione a seguinte linha a cada atividade que você deseja bloquear no modo retrato:

android: screenOrientation = "retrato"

Portanto, um exemplo completo pode ter a seguinte aparência:

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

Para Android: Em seu arquivo de manifesto, coloque:

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

Então, dentro da tag do aplicativo, coloque:

tools:ignore="LockedOrientationActivity"

E então, em todo o conjunto de atividades:

android:screenOrientation="portrait"
Ankit Adlakha
fonte
1

use isso para problemas de orientação de ipad ios que deseja alterar no arquivo 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
fonte
1
Um link para uma solução é bem-vindo, mas certifique-se de que sua resposta seja útil sem ele: adicione contexto ao link para que seus outros usuários tenham uma ideia do que ele é e por que está lá, depois cite a parte mais relevante da página que você ' novo link para caso a página de destino não esteja disponível. Respostas que são pouco mais do que um link podem ser excluídas.
bipe duplo
0

Você pode usar o módulo e a função de bloqueio de orientação reac-nativolockToPortrait() .
Isso pode ser útil se você também gostaria de ter algumas das telas com orientação desbloqueada - neste caso, você também pode usar a unlockAllOrientations()função.

Filip Kwiatkowski
fonte
-3

Se você estiver usando o projeto RN expo, e o app contiver navegação reativa, configurar a navegação para o código a seguir me ajudou.

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