Я нашел другое решение на GitHub , похожее на Mo sh Ответ Феу с использованием DeviceMotion, но с использованием гаммы и бета (ось x и y) вместо альфа (ось z) ) выяснить вращение устройства. В моем случае я достиг более удовлетворительного результата с этой техникой.
isPortrait(gamma: number, beta: number) {
const ABSOLUTE_GAMMA = Math.abs(gamma);
const ABSOLUTE_BETA = Math.abs(beta);
const isGammaNegative = Math.sign(gamma) === -1;
if (ABSOLUTE_GAMMA <= 0.04 && ABSOLUTE_BETA <= 0.24) {
//Portrait mode, on a flat surface.
return true;
} else
if (
(ABSOLUTE_GAMMA <= 1.0 || ABSOLUTE_GAMMA >= 2.3) &&
ABSOLUTE_BETA >= 0.5
) {
//General Portrait mode, accounting for forward and back tilt on the top of the phone.
return true;
} else {
if (isGammaNegative) {
//Landscape mode with the top of the phone to the left.
return false;
} else {
//Landscape mode with the top of the phone to the right.
return false;
}
}
}
И я вызываю его в слушателе из метода componentDidMount ( рекомендуется сначала проверить доступность датчика с помощью DeviceMotion.isAvailableAsyn c () ):
const sensorAvailable = await DeviceMotion.isAvailableAsync();
if (sensorAvailable) {
DeviceMotion.addListener(({ rotation }) => {
const { gamma, beta } = rotation;
this.setState({
orientation: this.isPortrait(gamma, beta) ? 'portrait' : 'landscape'
});
});
}