A React Native library that allows you to listen to orientation changes, lock interface orientation to a selected one and get current orientation. Written in Kotlin, Swift and Typescript. It supports both the Old and New React Native architecture.
This library takes inspiration from and builds upon the following amazing alternatives:
- Get the current orientation of the device
- Get the current orientation of the interface
- Get the current interface orientation status (locked or unlocked)
- Listen to device orientation changes
- Listen to interface orientation changes
- Listen to interface orientation status changes
- Lock the interface orientation to a specific orientation
- Unlock the interface orientation
- Reset supported interface orientations to settings
- Check if autorotation is enabled (Android only)
You can install the package via npm or yarn:
npm install react-native-orientation-director
yarn add react-native-orientation-director
Don't forget to run pod-install.
This library can be installed only for Development Builds using the following command:
npx expo install react-native-orientation-director
To properly handle interface orientation changes in iOS, you need to update your AppDelegate.mm file. In your AppDelegate.mm file, import "OrientationDirector.h" and implement supportedInterfaceOrientationsForWindow method as follows:
#import <OrientationDirector.h>
- (UIInterfaceOrientationMask)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window
{
return [OrientationDirector getSupportedInterfaceOrientationsForWindow];
}
If you need help, you can check the example project.
There is no need to do anything in Android, it works out of the box.
This library exports a class called: RNOrientationDirector that exposes the following methods:
Method | Description |
---|---|
getInterfaceOrientation | Returns the last interface orientation |
getDeviceOrientation | Returns the last device orientation |
lockTo | Locks the interface to a specific orientation |
unlock | Unlock the interface |
isLocked | Returns the current interface orientation status (locked / unlocked) |
isAutoRotationEnabled | (Android Only) Returns if auto rotation is enabled |
listenForDeviceOrientationChanges | Triggers a provided callback each time the device orientation changes |
listenForInterfaceOrientationChanges | Triggers a provided callback each time the interface orientation changes |
listenForLockChanges | Triggers a provided callback each time the interface orientation status changes |
convertOrientationToHumanReadableString | Returns a human readable string based on the given orientation |
convertAutoRotationToHumanReadableString | Returns a human readable string based on the given auto rotation |
setHumanReadableOrientations | Sets the mapping needed to convert orientation values to human readable strings |
setHumanReadableAutoRotations | Sets the mapping needed to convert auto rotation values to human readable strings |
resetSupportedInterfaceOrientations | Resets the supported interface orientations to settings |
isLockableOrientation | Determines if orientation is lockable |
In addition, the library exposes the following hooks:
Hook | Description |
---|---|
useInterfaceOrientation | Returns the current interface orientation and listens to changes |
useDeviceOrientation | Returns the current device orientation and listens to changes |
useIsInterfaceOrientationLocked | Returns the current interface orientation status and listens to changes |
Head over to the example project to see how to use the library.
Please be aware that there is a subtle difference between the device orientation and the interface orientation.
When you device is either in landscape left or right orientation, your interface is inverted, this is why lockTo method needs a second parameter to discriminate which type of orientation your are supplying.
To match developers expectations, if you supply a device orientation and OrientationType.device, lockTo switches landscapeRight with left and vice versa to property align the interface orientation.
This behavior comes from the native API, you can find more information in their documentation:
Since on Android we need to deal with sensors and their usage, it is worth noting that the device orientation computation works differently than on iOS, mainly in the following ways:
- Upon start up, all required sensors are enabled just for the initial device orientation computation, then they are disabled;
- Each time a new device orientation listener is added, all required sensors are enabled if disabled;
- After the last device orientation listener is removed, all required sensors are disabled;
This behavior allows us to follow Google's best practices related to the Sensors Framework. More here.
- Add JS side tests
- Add iOS side tests
See the contributing guide to learn how to contribute to the repository and the development workflow.
Made with create-react-native-library