【问题标题】:screen orientation on react native反应原生的屏幕方向
【发布时间】:2021-05-05 19:47:10
【问题描述】:

我正在尝试使用 expo 在 react native 中添加旋转功能。遵循教程并在谷歌和这里搜索,但不知何故,它们都没有工作。旋转模拟器时未检测到屏幕尺寸。因此,它不会从纵向变为横向,反之亦然。 您可以看到下面我尝试通过一个工作示例尝试的代码,但是当我应用它时它不起作用。非常感谢任何帮助。

const [orientation, setOrientation] = useState("");
const window = useWindowDimensions();

 useEffect(() => {
  Dimensions.addEventListener("change", ({ window: { width, height } }) => {
   if (width < height) {
    // this is in portrait mode
    setOrientation("Portrait");
   } else {
    // this is in landscape mode
    setOrientation("Landscape");
   }
 });
}, []);

return (
  <View style={styles.container}>
   <Text style={{ color: "red", fontSize: 30, fontWeight: "bold" }}>
     {orientation}
   </Text>
  </View>

const styles = StyleSheet.create({
  container: {
  flex: 1,
  alignItems: "center",
  justifyContent: "center",
 },
});

【问题讨论】:

标签: react-native orientation


【解决方案1】:

我有一个非常干净有效的方法来解决这个问题

Working Example

创建一个名为 components 的文件夹,并在其中创建一个名为 Orientation.js 的文件

然后在Orientation.js里面

import { Dimensions } from 'react-native';

const msp = (dim, limit) => {
  return dim.scale * dim.width >= limit || dim.scale * dim.height >= limit;
};

const isPortrait = () => {
  const dim = Dimensions.get('screen');
  return dim.height >= dim.width;
};

const isLandscape = () => {
  const dim = Dimensions.get('screen');
  return dim.width >= dim.height;
};

const isTablet = () => {
  const dim = Dimensions.get('screen');
  return (
    (dim.scale < 2 && msp(dim, 1000)) || (dim.scale >= 2 && msp(dim, 1900))
  );
};

const isPhone = () => {
  return !isTablet();
};

export default {
  isPortrait,
  isLandscape,
  isTablet,
  isPhone,
};

然后像这样设置你的state 和useEffect

import Orientation from "./components/Orientation"

const [orientation, setOrientation] = useState(
    Orientation.isPortrait() ? 'portrait' : 'landscape'
  );

  useEffect(() => {
    Dimensions.addEventListener('change', () => {
      setOrientation(Orientation.isPortrait() ? 'portrait' : 'landscape');
    });
  }, []);

这将完全按照您的要求工作

结果:

【讨论】:

  • 嘿,谢谢您的回答,但仍然缺少一件事。文本不旋转。只是文字从纵向变为横向。这可能是什么原因?
  • 我已将我的设备中的结果添加到答案中
  • 再次感谢,但很奇怪,当我将工作示例中的确切代码复制到我的代码时,文本没有旋转。当我尝试小吃中的工作示例时,它可以完美地工作。
  • 检查您的state、useEffect、return statement 等是否相同...另外,我注意到您的代码中的const window = useWindowDimensions();...您可以删除它,它不是做任何事
  • 它没有用。可能不是最佳实践,但我添加了 transform: [{ rotate: "90deg" }],它的工作方式是这样的。
猜你喜欢
  • 2021-03-01
  • 1970-01-01
  • 2020-12-12
  • 2021-02-22
  • 2019-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多