React-Native: @hortau/react-native-orientation-locker

记 iOS 横竖屏没有效果的处理方法 

npm官网文档:@hortau/react-native-orientation-locker - npm

在 Android 端,不需要任何配置。

主要是 ios ,

#import "Orientation.h"


- (UIInterfaceOrientationMask)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window {
  return [Orientation getOrientation];
}

使用场景

首先、国内很多APP基本很少有需求要求APP能跟随系统自动横屏。

如果要求跟随系统自动横屏,利用次组件监听系统的横竖屏状态,重新计算设备的宽高、安全区域,也是可以做的,相对来说麻烦一些,后续有空也会单独出一篇文章分享经验心得。

1、视频播放页面,如下图所示。这类页面可以监听用户设备的横竖屏状态,改变视频的全屏播放状态。但是最简单的做法是用户点击全屏播放,再改变设备横竖屏状态。跟国内腾讯视频、爱奇艺、优酷等差不多的效果。注意的是,返回操作可以控制是返回上一页还是切换到竖屏、而安卓的物理返回键或者在屏幕左侧右滑返回的时候,一定要在页面卸载函数中让APP切换到竖屏。

代码分享:

import React, {useEffect, useState} from 'react';
import {StyleSheet, View} from 'react-native';
import {commonSize, commonStyle} from 'src/assets/css/commonStyle';
import {SafeAreaView} from 'react-native-safe-area-context';
import {CustomNavbar, HeightSpacer} from 'src/components';
import VideoPlayer from 'react-native-media-console';
import Orientation from '@hortau/react-native-orientation-locker';
import {useNavigation} from '@react-navigation/native';

const VideoPlay = () => {
  const [edges, setEdges] = useState(['right', 'top', 'left']);
  const [isFullScreen, setIsFullScreen] = useState(false);
  const [disableBack, setDisableBack] = useState(true);
  const navigation = useNavigation();

  const videoInfo = {
    url: 'https://solar.huawei.com/-/media/SolarV4/solar-version2/asia-pacific/cn/success-stories/2023/Storie20/video/construction_flash_video.mp4',
    width: 569,
    height: 320,
    duration: 138000,
  };

  useEffect(() => {
    return () => {
      Orientation.lockToPortrait();
      setEdges(['right', 'top', 'left']);
      setIsFullScreen(false);
      setDisableBack(true);
    };
  }, []);

  return (
    <SafeAreaView
      edges={edges}
      style={[
        commonStyle.container,
        isFullScreen ? commonStyle.bg000 : commonStyle.bgFFF,
      ]}>
      {!isFullScreen && <CustomNavbar headerTitle={'视频播放'} />}
      <View
        style={[
          commonStyle.flexCenter,
          isFullScreen
            ? styles.fullVideoBox
            : styles.defVideoBox(videoInfo.width, videoInfo.height),
        ]}>
        <VideoPlayer
          navigator={navigation}
          controlTimeoutDelay={3000}
          disableBack={disableBack}
          showTimeRemaining={true}
          showHours={true}
          isFullscreen={isFullScreen}
          source={{
            uri: videoInfo.url,
          }}
          onEnterFullscreen={() => {
            Orientation.lockToLandscape();
            setEdges(['right', 'left']);
            setIsFullScreen(true);
            setDisableBack(false);
          }}
          onExitFullscreen={() => {
            Orientation.lockToPortrait();
            setEdges(['right', 'top', 'left']);
            setIsFullScreen(false);
            setDisableBack(true);
          }}
          onBack={() => {
            Orientation.lockToPortrait();
            setEdges(['right', 'top', 'left']);
            setIsFullScreen(false);
            setDisableBack(true);
          }}
        />
      </View>
      <HeightSpacer />
    </SafeAreaView>
  );
};

export default VideoPlay;

const styles = StyleSheet.create({
  defVideoBox: (width, height) => ({
    width: commonSize.width,
    height: (commonSize.width * height) / width,
  }),
  fullVideoBox: {
    width: '100%',
    height: '100%',
  },
});

2、需要使用签名组件的时候,可以在签名的时候横屏,签名确认后切换竖屏。 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值