如何在本机反应中解锁一个屏幕上的旋转

Posted

技术标签:

【中文标题】如何在本机反应中解锁一个屏幕上的旋转【英文标题】:How to unlock rotation on one screen in react native 【发布时间】:2020-05-12 15:19:50 【问题描述】:

我尝试在 webview 中使用 react-native-orientation 以使其成为唯一可以旋转的视图。

import React, useEffect from 'react';
import  WebView  from 'react-native-webview';
import Orientation from "react-native-orientation"

export function GameWebViewScreen(navigation) 
const link = ****

useEffect(() => 
    Orientation.unlockAllOrientations();
, [])

return <WebView source=uri: link/>

我收到 TypeError: null in not an object on unlockAllOrientations 调用。有谁知道这是一个问题,因为我没有按照说明here 中的说明配置本机文件,因为我还没有访问权限,或者?

我也尝试过使用类组件并得到了相同的结果。

我也愿意接受有关控制单个视图旋转的库的任何其他建议。

【问题讨论】:

对于这个 EXACT 问题,除了简单的 React,有人有答案吗? 【参考方案1】:

您需要按照说明设置本机文件并尝试执行manual linking。

监听 React Native 应用程序中的设备方向变化,并以编程方式为每个屏幕设置首选方向。适用于 androidios

示例:-

import Orientation from 'react-native-orientation'

componentDidMount() 
   Orientation.unlockAllOrientations();


componentWillUnmount() 
   Orientation.lockToPortrait();

您需要在 ios

中设置应用委托如下
#import "Orientation.h"

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

Android需要设置Orientation Package

在MainActivity.java中实现onConfigurationChanged方法

import android.content.Intent; // <--- import 
import android.content.res.Configuration; // <--- import 

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

您可以在这里找到更多信息react-native-orientation

【讨论】:

【参考方案2】:

如果准备好使用 native-stack

在 React Navigation v6 中使用下面的 import

import  createNativeStackNavigator  from '@react-navigation/native-stack';
const Stack = createNativeStackNavigator();

function MyStack() 
  return (
    <Stack.Navigator>
      <Stack.Screen name="Home" component=Home/>
      <Stack.Screen 
        name="Website" 
        component=Website 
        options=orientation: 'all' 
      />
    </Stack.Navigator>
  );

在 React Navigation v5 中使用下面的 import

import  createNativeStackNavigator  from 'react-native-screens/native-stack';
const Stack = createNativeStackNavigator();

function MyStack() 
  return (
    <Stack.Navigator>
      <Stack.Screen name="Home" component=Home/>
      <Stack.Screen 
        name="Website"
        component=Website 
        options=screenOrientation: 'all' 
      />
    </Stack.Navigator>
  );

【讨论】:

【参考方案3】:

我使用的是useEffect 而不是component...Mount,我没有设法只将单个屏幕锁定为横向,然后再返回纵向。我真的尝试了所有方法,例如:addOrientationListenerunlockAllOrientations、Xcode 中的配置等,但它只是没有用。

出于绝望,我终于像transform: [rotate: '90deg'], 一样旋转了整个视图。我知道这不是答案,但至少在我的情况下(带有选择选项的交互式视频),这是一个可以接受的替代方案,特别是因为应用程序的其余部分处于纵向模式。

【讨论】:

以上是关于如何在本机反应中解锁一个屏幕上的旋转的主要内容,如果未能解决你的问题,请参考以下文章

如何在本机反应中隐藏特定屏幕上的底部导航栏?

std::mutex 如何在不同的线程中解锁?

如何在iphone中解锁rootviewcontroller头文件

反应本机禁用自动旋转[重复]

如何在 Python 中解锁“安全”(读保护)PDF?

如何在 vSphere 6.x 中解锁并重置 SSO 密码