在 React-Native 中将 RCTRootView 作为子视图添加到 rootViewController

Posted

技术标签:

【中文标题】在 React-Native 中将 RCTRootView 作为子视图添加到 rootViewController【英文标题】:Add RCTRootView as a subview to rootViewController in React-Native 【发布时间】:2016-08-08 23:20:02 【问题描述】:

如何将 RCTRootView 作为子视图添加到应用程序 RootViewController。

这就是我想要实现的。我有一个 ios 本机应用程序,可以将一些 OpenGLES 内容呈现到视图上。它显示设备摄像头馈送并跟踪用户面部并在其上显示一些可视化(很像 snapchat AR 过滤器)。这一切都很好,我也有原生的 iOS UIKit 元素。我想在这个摄像头提要上覆盖一些 react-native UI 元素(删除 UIKit 组件)并实现 UI 功能。

所以我希望在 react-native (RCTRootView) 下方有摄像头馈送(即:打开 gl 视图)。大多喜欢this link。我几乎做到了,但有一些烦人的布局问题。

默认 AppDelegate.m 实现

NSURL *jsCodeLocation;
jsCodeLocation = [[RCTBundleURLProvider sharedSettings]
jsBundleURLForBundleRoot:@"index.ios" fallbackResource:nil];

RCTRootView *rootView = [[RCTRootView alloc] 
initWithBundleURL:jsCodeLocation moduleName:@"AwesomeProject" initialProperties:nil launchOptions:launchOptions];
rootView.backgroundColor = [[UIColor alloc] initWithRed:1.0f green:1.0f blue:1.0f alpha:1];

self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
UIViewController *rootViewController = [UIViewController new];
rootViewController.view = rootView;
self.window.rootViewController = rootViewController;
[self.window makeKeyAndVisible];

尝试将其添加为子视图会导致此结果

...
//  rootViewController.view = rootView;
[rootViewController.view addSubview:rootView];
...

灵活的宽度和高度导致这个

...
//  rootViewController.view = rootView;
rootView.sizeFlexibility = RCTRootViewSizeFlexibilityWidthAndHeight;
[rootViewController.view addSubview:rootView];
...

在我看来这可能是布局问题?但我会以错误的方式解决这个问题吗?欢迎任何帮助。

p.s :这就是带有 react-native UI atm 的 AR 相机馈送视图的样子。

p.p.s:如果我不将 RCTRootView 添加为子视图,那么它将始终在后台(即摄像头馈送将始终位于 react-native UI 视图的顶部)

【问题讨论】:

您是否尝试过使用 setFrame 在 RCTView 上手动设置大小? 是的。它不会调整所有 ReactNative 视图的大小。似乎 flexbox 布局无法正常工作或没有正确链接,因为我更改了它的设置方式。 【参考方案1】:

我遇到了类似的问题,发现以下组合符合我的喜好:

// Do *NOT* set reactView.sizeFlexibility

reactView.bounds = [[UIScreen mainScreen]bounds]];

reactView.layer.anchorPoint = CGPointMake( 0, 0 );

警告:我在 Ignite 上运行,所以不知道这是否适用于 flexbox。

【讨论】:

以上是关于在 React-Native 中将 RCTRootView 作为子视图添加到 rootViewController的主要内容,如果未能解决你的问题,请参考以下文章

如何在 react-native 函数组件中将获取数据设置为文本字段

在 React-Native 中将 RCTRootView 作为子视图添加到 rootViewController

如何在 react-native 中将 JPG 图像转换为 PNG

如何在 react-native 中将函数的结果从一个组件传递到另一个组件?

多部分/表单数据请求在 react-native 中失败

React-native 上传图片作为 FormData