A React Native module to retrieve interface/device orientation, listen to orientation changes, and lock screen to a specific orientation.
- iOS
- Android
- Windows
npm install react-native-orientation-manager
yarn add react-native-orientation-manager
Make sure pods are installed by navigating to the iOS project and running:
bundle exec pod install
To ensure that the module is fully initialized during app startup, include this import statement in your app's entry file (index.*
or App.*
):
import "react-native-orientation-manager";
For example:
import "react-native-orientation-manager";
import { AppRegistry } from "react-native";
import App from "./src/App";
import { name as appName } from "./app.json";
AppRegistry.registerComponent(appName, () => App);
Add the following code to MainApplication.java
which is probably located at android/app/src/main/java/<your package name>/MainApplication.java
// ... code
import com.kroosx4v.orientationmanager.OrientationManagerActivityLifecycleCallbacks;
public class MainApplication extends Application implements ReactApplication
{
// ...code
@Override
public void onCreate()
{
// ...code
registerActivityLifecycleCallbacks(new OrientationManagerActivityLifecycleCallbacks());
}
}
Add the following code to your project's AppDelegate.mm
// ...code
#import "RNOrientationManager.h"
@implementation AppDelegate
// ...code
- (UIInterfaceOrientationMask)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window
{
return [RNOrientationManager getSupportedInterfaceOrientations];
}
@end
import Orientations from "react-native-orientation-manager";
import type { InterfaceOrientation, DeviceOrientation } from "react-native-orientation-manager";
const currentInterfaceOrientation: InterfaceOrientation = Orientations.interfaceOrientation;
const currentDeviceOrientation: DeviceOrientation = Orientations.deviceOrientation;
import { Text } from "react-native";
import { useInterfaceOrientation, useDeviceOrientation } from "react-native-orientation-manager";
function OrientationValues(): React.JSX.Element
{
const interfaceOrientation = useInterfaceOrientation();
const deviceOrientation = useDeviceOrientation();
return (
<>
<Text style={{ color: "#841584" }}>
Interface orientation: {interfaceOrientation.getName()}
</Text>
<Text style={{ color: "#841584" }}>
Device orientation: {deviceOrientation.getName()}
</Text>
</>
);
}
import { lockToLandscape, lockToPortrait, unlockAllOrientations, resetInterfaceOrientationSetting } from "react-native-orientation-manager";
lockToLandscape();
// ...or
lockToPortrait();
// ...or
unlockAllOrientations();
// remove lock
resetInterfaceOrientationSetting();
import { View } from "react-native";
import { OrientationLocker } from "react-native-orientation-manager";
function LandscapeOnlyScreen(): React.JSX.Element
{
return (
<View style={{ flex: 1 }}>
<OrientationLocker lock="Landscape" />
</View>
);
}
import { addInterfaceOrientationChangeListener, addDeviceOrientationChangeListener } from "react-native-orientation-manager";
import type { InterfaceOrientation, DeviceOrientation } from "react-native-orientation-manager";
const listenerRemover = addInterfaceOrientationChangeListener((interfaceOrientation: InterfaceOrientation) => {
if (interfaceOrientation.isPortrait())
{
// ...do something
}
});
const listenerRemover2 = addDeviceOrientationChangeListener((deviceOrientation: DeviceOrientation) => {
if (deviceOrientation.isPortrait())
{
// ...do something
}
});
Do something every time the interface orientation changes while a screen is focused (requires @react-navigation/native 5x or higher):
import { useInterfaceOrientationWhenFocusedEffect } from "react-native-orientation-manager";
import type { InterfaceOrientation } from "react-native-orientation-manager";
import { useNavigation } from "@react-navigation/native";
function SomeComponent(): React.JSX.Element
{
const navigation = useNavigation();
useInterfaceOrientationWhenFocusedEffect((interfaceOrientation: InterfaceOrientation) => {
if (!interfaceOrientation.isLandscape())
{
// Only allow landscape orientation in this screen with the possibility of leaving it when orientation changes to portrait
navigation.goBack();
return;
}
// optionally return a cleanup function
return () => {
// ...do something
};
});
}
Function | Return Type |
---|---|
isUnknown() |
boolean |
isPortrait() |
boolean |
isPortraitUpsideDown() |
boolean |
isLandscapeLeft() |
boolean |
isLandscapeRight() |
boolean |
isEitherPortrait() |
boolean |
isLandscape() |
boolean |
getName() |
string |
equals(interfaceOrientation: InterfaceOrientation) |
boolean |
Function | Return Type |
---|---|
isUnknown() |
boolean |
isPortrait() |
boolean |
isPortraitUpsideDown() |
boolean |
isLandscapeLeft() |
boolean |
isLandscapeRight() |
boolean |
isFaceUp() |
boolean |
isFaceDown() |
boolean |
isEitherPortrait() |
boolean |
isLandscape() |
boolean |
isFace() |
boolean |
getName() |
string |
equals(deviceOrientation: DeviceOrientation) |
boolean |
Property | Type | Represents |
---|---|---|
interfaceOrientation |
InterfaceOrientation | Current interface orientation |
deviceOrientation |
DeviceOrientation | Current device orienation |
Function | Returns |
---|---|
addInterfaceOrientationChangeListener((interfaceOrientation: InterfaceOrientation) => void) |
Listener remover function |
addDeviceOrientationChangeListener((deviceOrientation: DeviceOrientation) => void) |
Listener remover function |
Function | Return Type | Notes |
---|---|---|
async lockToPortrait() |
Promise<void> | |
async lockToPortraitUpsideDown() |
Promise<void> | |
async lockToLandscapeLeft() |
Promise<void> | |
async lockToLandscapeRight() |
Promise<void> | |
async lockToLandscape() |
Promise<void> | |
async lockToAllOrientationsButUpsideDown() |
Promise<void> | Not supported on Android |
async unlockAllOrientations() |
Promise<void> |
Function | Return Type |
---|---|
async resetInterfaceOrientationSetting() |
Promise<void> |
Prop | Type | Value |
---|---|---|
lock |
string | Can be one of the following:
|
Hook | Return Type | Functionality |
---|---|---|
useInterfaceOrientation() |
InterfaceOrientation | Uses current interface orientation as a state |
useDeviceOrientation() |
DeviceOrientation | Uses current device orientation as a state |
useInterfaceOrientationEffect( effect: (interfaceOrientation: InterfaceOrientation) => CleanupFunction | undefined, dependencies: any[] = [], ) |
void | This runs on mount and subsequently whenever the interface orientation changes or when dependencies change during a re-render |
useDeviceOrientationEffect( effect: (deviceOrientation: DeviceOrientation) => CleanupFunction | undefined, dependencies: any[] = [], ) |
void | This runs on mount and subsequently whenever the device orientation changes or when dependencies change during a re-render |
useInterfaceOrientationWhenFocusedEffect( effect: (interfaceOrientation: InterfaceOrientation) => CleanupFunction | undefined, dependencies: any[] = [], ) |
void | This hook runs under three conditions:
You can provide a cleanup function that gets called before the effect function must run again or when screen loses focus |