Skip to content

A React Native library that allows you to detect device orientation changes, interface orientation changes and lock interface orientation.

License

Notifications You must be signed in to change notification settings

gladiuscode/react-native-orientation-director

Repository files navigation

NPM Version


react-native-orientation-director

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:

  1. react-native-orientation-locker
  2. react-native-orientation-handler

Features

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

Installation

React Native Bare

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.

Expo

This library can be installed only for Development Builds using the following command:

npx expo install react-native-orientation-director

Setup

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.

Usage

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.

Warning

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:

  1. iOS - UIInterfaceOrientation
  2. iOS - UIDeviceOrientation
  3. Android - getRotation

Android

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:

  1. Upon start up, all required sensors are enabled just for the initial device orientation computation, then they are disabled;
  2. Each time a new device orientation listener is added, all required sensors are enabled if disabled;
  3. 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.

Roadmap

  • Add JS side tests
  • Add iOS side tests

Contributing

See the contributing guide to learn how to contribute to the repository and the development workflow.


Made with create-react-native-library