Вам придется использовать внешнюю зависимость для управления этим.Что-то вроде react-native-orientation-locker
может дать вам то, что вы хотите.Эта опция требует, чтобы вы использовали полный react-native
проект, так как он потребует от вас связать собственный код, так что не будет работать в Expo
.Вы можете прочитать больше об этом здесь .Ниже приведены основные инструкции по использованию репозитория.
Вы можете установить его следующим образом:
npm install react-native-orientation-locker --save
react-native link react-native-orientation-locker
Есть несколько дополнительных шагов, которые необходимо выполнить после того, как вы связали его.
Конфигурация
iOS
Добавьте следующее в AppDelegate.m
вашего проекта:
+#import "Orientation.h"
@implementation AppDelegate
// ...
+- (UIInterfaceOrientationMask)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window {
+ return [Orientation getOrientation];
+}
@end
Android
Добавьте следующее в android / app / src / main / AndroidManifest.xml
<activity
....
+ android:configChanges="keyboard|keyboardHidden|orientation|screenSize"
android:windowSoftInputMode="adjustResize">
....
</activity>
Реализация метода onConfigurationChanged (в MainActivity.java
)
// ...
+import android.content.Intent;
+import android.content.res.Configuration;
public class MainActivity extends ReactActivity {
+ @Override
+ public void onConfigurationChanged(Configuration newConfig) {
+ super.onConfigurationChanged(newConfig);
+ Intent intent = new Intent("onConfigurationChanged");
+ intent.putExtra("newConfig", newConfig);
+ this.sendBroadcast(intent);
+ }
// ......
}
Получение ориентации:
Затем вы можете установить слушателя, где вы хотите получить доступ к ориентации,обычно вы добавляете это в componentDidMount
и удаляете, перемещаете его в componentWillUnmount
.
Вот пример кода, который вы можете использовать для его настройки.
import Orientation from 'react-native-orientation-locker';
_onOrientationDidChange = (orientation) => {
if (orientation === 'LANDSCAPE-LEFT') {
//do something with landscape left layout
}
if (orientation === 'LANDSCAPE-RIGHT') {
//do something with landscape right layout
}
};
componentWillMount() {
//The getOrientation method is async. It happens sometimes that
//you need the orientation at the moment the js starts running on device.
//getInitialOrientation returns directly because its a constant set at the
//beginning of the js code.
var initial = Orientation.getInitialOrientation();
if (initial === 'PORTRAIT') {
//do stuff
} else {
//do other stuff
}
},
componentDidMount() {
Orientation.getAutoRotateState((rotationLock) => this.setState({rotationLock}));
//this allows to check if the system autolock is enabled or not.
Orientation.lockToPortrait(); //this will lock the view to Portrait
//Orientation.lockToLandscapeLeft(); //this will lock the view to Landscape
//Orientation.unlockAllOrientations(); //this will unlock the view to all Orientations
//get current UI orientation
/*
Orientation.getOrientation((orientation)=> {
console.log("Current UI Orientation: ", orientation);
});
//get current device orientation
Orientation.getDeviceOrientation((deviceOrientation)=> {
console.log("Current Device Orientation: ", deviceOrientation);
});
*/
Orientation.addOrientationListener(this._onOrientationDidChange);
},
componentWillUnmount () {
Orientation.removeOrientationListener(this._onOrientationDidChange);
}
Это будет означатьчто в вашей функции _onOrientationDidChange
он получит следующее:
'PORTRAIT'
'LANDSCAPE-LEFT'
кнопка левой камеры камеры вправо 'LANDSCAPE-RIGHT'
камера вправо домой кнопка слева 'PORTRAIT-UPSIDEDOWN'
'UNKNOWN'