From 4d37cf0fbcc529ad75eb4a04a185036a887e42c2 Mon Sep 17 00:00:00 2001 From: Valentin Shergin Date: Mon, 4 Dec 2017 13:31:40 -0800 Subject: [PATCH] RCTSurface: RCTSurfaceHostingView, interop layer beteween UIKit and RCTSurface Summary: UIView subclass which providers interoperability between UIKit and Surface regarding layout and life-cycle. Reviewed By: rsnara Differential Revision: D6465922 fbshipit-source-id: 2a7cfb70119d460bc22968d1aa780833bf47d7f6 --- React/Base/Surface/RCTSurface.mm | 1 + .../RCTSurfaceHostingView.h | 69 ++++++ .../RCTSurfaceHostingView.mm | 224 ++++++++++++++++++ .../RCTSurfaceSizeMeasureMode.h | 23 ++ React/React.xcodeproj/project.pbxproj | 64 ++++- 5 files changed, 380 insertions(+), 1 deletion(-) create mode 100644 React/Base/Surface/SurfaceHostingView/RCTSurfaceHostingView.h create mode 100644 React/Base/Surface/SurfaceHostingView/RCTSurfaceHostingView.mm create mode 100644 React/Base/Surface/SurfaceHostingView/RCTSurfaceSizeMeasureMode.h diff --git a/React/Base/Surface/RCTSurface.mm b/React/Base/Surface/RCTSurface.mm index 0f205b74a..ebe11690b 100644 --- a/React/Base/Surface/RCTSurface.mm +++ b/React/Base/Surface/RCTSurface.mm @@ -323,6 +323,7 @@ } RCTUIManager *uiManager = batchedBridge.uiManager; + RCTExecuteOnUIManagerQueue(^{ [uiManager registerRootViewTag:self->_rootViewTag]; diff --git a/React/Base/Surface/SurfaceHostingView/RCTSurfaceHostingView.h b/React/Base/Surface/SurfaceHostingView/RCTSurfaceHostingView.h new file mode 100644 index 000000000..48c91eba5 --- /dev/null +++ b/React/Base/Surface/SurfaceHostingView/RCTSurfaceHostingView.h @@ -0,0 +1,69 @@ +/** + * Copyright (c) 2015-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + */ + +#import + +#import +#import + +@class RCTBridge; +@class RCTSurface; + +typedef UIView *(^RCTSurfaceHostingViewActivityIndicatorViewFactory)(); + +NS_ASSUME_NONNULL_BEGIN + +/** + * UIView subclass which providers interoperability between UIKit and + * Surface regarding layout and life-cycle. + * This class can be used as easy-to-use general purpose integration point + * of ReactNative-powered experiences in UIKit based apps. + */ +@interface RCTSurfaceHostingView : UIView + +/** + * Designated initializer. + * Instanciates a view with given Surface object. + * Note: The view retains the surface object. + */ +- (instancetype)initWithSurface:(RCTSurface *)surface NS_DESIGNATED_INITIALIZER; + +/** + * Convenience initializer. + * Instanciates a Surface object with given `bridge`, `moduleName`, and + * `initialProperties`, and then use it to instanciate a view. + */ +- (instancetype)initWithBridge:(RCTBridge *)bridge + moduleName:(NSString *)moduleName + initialProperties:(NSDictionary *)initialProperties; + +/** + * Surface object which is currently using to power the view. + * Read-only. + */ +@property (nonatomic, strong, readonly) RCTSurface *surface; + +/** + * Size measure mode which are defining relationship between UIKit and ReactNative + * layout approaches. + * Defaults to `RCTSurfaceSizeMeasureModeWidthAtMost | RCTSurfaceSizeMeasureModeHeightAtMost`. + */ +@property (nonatomic, assign) RCTSurfaceSizeMeasureMode sizeMeasureMode; + +/** + * Activity indicator factory. + * A hosting view may use this block to instantiate and display custom activity + * (loading) indicator (aka "spinner") when it needed. + * Defaults to `nil` (no activity indicator). + */ +@property (nonatomic, copy, nullable) RCTSurfaceHostingViewActivityIndicatorViewFactory activityIndicatorViewFactory; + +@end + +NS_ASSUME_NONNULL_END diff --git a/React/Base/Surface/SurfaceHostingView/RCTSurfaceHostingView.mm b/React/Base/Surface/SurfaceHostingView/RCTSurfaceHostingView.mm new file mode 100644 index 000000000..8f5c20e85 --- /dev/null +++ b/React/Base/Surface/SurfaceHostingView/RCTSurfaceHostingView.mm @@ -0,0 +1,224 @@ +/** + * Copyright (c) 2015-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + */ + +#import "RCTSurfaceHostingView.h" + +#import "RCTDefines.h" +#import "RCTSurface.h" +#import "RCTSurfaceDelegate.h" +#import "RCTSurfaceView.h" +#import "RCTUtils.h" + +@interface RCTSurfaceHostingView () + +@property (nonatomic, assign) BOOL isActivityIndicatorViewVisible; +@property (nonatomic, assign) BOOL isSurfaceViewVisible; + +@end + +@implementation RCTSurfaceHostingView { + UIView *_Nullable _activityIndicatorView; + UIView *_Nullable _surfaceView; + RCTSurfaceStage _stage; +} + +RCT_NOT_IMPLEMENTED(- (instancetype)init) +RCT_NOT_IMPLEMENTED(- (instancetype)initWithFrame:(CGRect)frame) +RCT_NOT_IMPLEMENTED(- (nullable instancetype)initWithCoder:(NSCoder *)coder) + +- (instancetype)initWithBridge:(RCTBridge *)bridge + moduleName:(NSString *)moduleName + initialProperties:(NSDictionary *)initialProperties +{ + RCTSurface *surface = + [[RCTSurface alloc] initWithBridge:bridge + moduleName:moduleName + initialProperties:initialProperties]; + + return [self initWithSurface:surface]; +} + +- (instancetype)initWithSurface:(RCTSurface *)surface +{ + if (self = [super initWithFrame:CGRectZero]) { + _surface = surface; + + _sizeMeasureMode = + RCTSurfaceSizeMeasureModeWidthAtMost | + RCTSurfaceSizeMeasureModeHeightAtMost; + + _surface.delegate = self; + _stage = surface.stage; + [self _updateViews]; + } + + return self; +} + +- (CGSize)intrinsicContentSize +{ + if (RCTSurfaceStageIsPreparing(_stage)) { + if (_activityIndicatorView) { + return _activityIndicatorView.intrinsicContentSize; + } + + return CGSizeZero; + } + + return _surface.intrinsicSize; +} + +- (CGSize)sizeThatFits:(CGSize)size +{ + if (RCTSurfaceStageIsPreparing(_stage)) { + if (_activityIndicatorView) { + return [_activityIndicatorView sizeThatFits:size]; + } + + return CGSizeZero; + } + + CGSize minumumSize = CGSizeZero; + CGSize maximumSize = CGSizeMake(INFINITY, INFINITY); + + if (_sizeMeasureMode & RCTSurfaceSizeMeasureModeWidthExact) { + minumumSize.width = size.width; + maximumSize.width = size.width; + } + else if (_sizeMeasureMode & RCTSurfaceSizeMeasureModeWidthAtMost) { + maximumSize.width = size.width; + } + + if (_sizeMeasureMode & RCTSurfaceSizeMeasureModeHeightExact) { + minumumSize.height = size.height; + maximumSize.height = size.height; + } + else if (_sizeMeasureMode & RCTSurfaceSizeMeasureModeHeightAtMost) { + maximumSize.height = size.height; + } + + return [_surface sizeThatFitsMinimumSize:minumumSize + maximumSize:maximumSize]; +} + +- (void)setStage:(RCTSurfaceStage)stage +{ + if (stage == _stage) { + return; + } + + BOOL shouldInvalidateLayout = + RCTSurfaceStageIsRunning(stage) != RCTSurfaceStageIsRunning(_stage) || + RCTSurfaceStageIsPreparing(stage) != RCTSurfaceStageIsPreparing(_stage); + + _stage = stage; + + if (shouldInvalidateLayout) { + [self _invalidateLayout]; + [self _updateViews]; + } +} + +- (void)setSizeMeasureMode:(RCTSurfaceSizeMeasureMode)sizeMeasureMode +{ + if (sizeMeasureMode == _sizeMeasureMode) { + return; + } + + _sizeMeasureMode = sizeMeasureMode; + [self _invalidateLayout]; +} + +#pragma mark - isActivityIndicatorViewVisible + +- (void)setIsActivityIndicatorViewVisible:(BOOL)visible +{ + if (_isActivityIndicatorViewVisible == visible) { + return; + } + + if (visible) { + if (_activityIndicatorViewFactory) { + _activityIndicatorView = _activityIndicatorViewFactory(); + _activityIndicatorView.frame = self.bounds; + _activityIndicatorView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; + [self addSubview:_activityIndicatorView]; + } + } else { + [_activityIndicatorView removeFromSuperview]; + _activityIndicatorView = nil; + } +} + +#pragma mark - isSurfaceViewVisible + +- (void)setIsSurfaceViewVisible:(BOOL)visible +{ + if (_isSurfaceViewVisible == visible) { + return; + } + + if (visible) { + _surfaceView = _surface.view; + _surfaceView.frame = self.bounds; + _surfaceView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; + [self addSubview:_surfaceView]; + } else { + [_surfaceView removeFromSuperview]; + _surfaceView = nil; + } +} + +#pragma mark - activityIndicatorViewFactory + +- (void)setActivityIndicatorViewFactory:(RCTSurfaceHostingViewActivityIndicatorViewFactory)activityIndicatorViewFactory +{ + _activityIndicatorViewFactory = activityIndicatorViewFactory; + if (_isActivityIndicatorViewVisible) { + _isActivityIndicatorViewVisible = NO; + self.isActivityIndicatorViewVisible = YES; + } +} + +#pragma mark - Private stuff + +- (void)_invalidateLayout +{ + [self.superview setNeedsLayout]; +} + +- (void)_updateViews +{ + self.isSurfaceViewVisible = RCTSurfaceStageIsRunning(_stage); + self.isActivityIndicatorViewVisible = RCTSurfaceStageIsPreparing(_stage); +} + +- (void)didMoveToWindow +{ + [super didMoveToWindow]; + [self _updateViews]; +} + +#pragma mark - RCTSurfaceDelegate + +- (void)surface:(RCTSurface *)surface didChangeStage:(RCTSurfaceStage)stage +{ + RCTExecuteOnMainQueue(^{ + [self setStage:stage]; + }); +} + +- (void)surface:(RCTSurface *)surface didChangeIntrinsicSize:(CGSize)intrinsicSize +{ + RCTExecuteOnMainQueue(^{ + [self _invalidateLayout]; + }); +} + +@end diff --git a/React/Base/Surface/SurfaceHostingView/RCTSurfaceSizeMeasureMode.h b/React/Base/Surface/SurfaceHostingView/RCTSurfaceSizeMeasureMode.h new file mode 100644 index 000000000..825d05d96 --- /dev/null +++ b/React/Base/Surface/SurfaceHostingView/RCTSurfaceSizeMeasureMode.h @@ -0,0 +1,23 @@ +/** + * Copyright (c) 2015-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + */ + +#import + +/** + * Bitmask defines how size constrains from `-[UIView sizeThatFits:]` + * are translated to `-[RCTSurface sizeThatFitsMinimumSize:maximumSize:]`. + */ +typedef NS_OPTIONS(NSInteger, RCTSurfaceSizeMeasureMode) { + RCTSurfaceSizeMeasureModeWidthUndefined = 0 << 0, + RCTSurfaceSizeMeasureModeWidthExact = 1 << 0, + RCTSurfaceSizeMeasureModeWidthAtMost = 2 << 0, + RCTSurfaceSizeMeasureModeHeightUndefined = 0 << 2, + RCTSurfaceSizeMeasureModeHeightExact = 1 << 2, + RCTSurfaceSizeMeasureModeHeightAtMost = 2 << 2, +}; diff --git a/React/React.xcodeproj/project.pbxproj b/React/React.xcodeproj/project.pbxproj index 302177cfd..95e59f93a 100644 --- a/React/React.xcodeproj/project.pbxproj +++ b/React/React.xcodeproj/project.pbxproj @@ -1003,6 +1003,30 @@ 590D7BFE1EBD458B00D8A370 /* RCTShadowView+Layout.h in Headers */ = {isa = PBXBuildFile; fileRef = 590D7BFB1EBD458B00D8A370 /* RCTShadowView+Layout.h */; }; 590D7BFF1EBD458B00D8A370 /* RCTShadowView+Layout.m in Sources */ = {isa = PBXBuildFile; fileRef = 590D7BFC1EBD458B00D8A370 /* RCTShadowView+Layout.m */; }; 590D7C001EBD458B00D8A370 /* RCTShadowView+Layout.m in Sources */ = {isa = PBXBuildFile; fileRef = 590D7BFC1EBD458B00D8A370 /* RCTShadowView+Layout.m */; }; + 594F0A321FD23228007FBE96 /* RCTSurfaceHostingView.h in Headers */ = {isa = PBXBuildFile; fileRef = 594F0A2F1FD23228007FBE96 /* RCTSurfaceHostingView.h */; }; + 594F0A331FD23228007FBE96 /* RCTSurfaceHostingView.h in Headers */ = {isa = PBXBuildFile; fileRef = 594F0A2F1FD23228007FBE96 /* RCTSurfaceHostingView.h */; }; + 594F0A341FD23228007FBE96 /* RCTSurfaceHostingView.mm in Sources */ = {isa = PBXBuildFile; fileRef = 594F0A301FD23228007FBE96 /* RCTSurfaceHostingView.mm */; }; + 594F0A351FD23228007FBE96 /* RCTSurfaceHostingView.mm in Sources */ = {isa = PBXBuildFile; fileRef = 594F0A301FD23228007FBE96 /* RCTSurfaceHostingView.mm */; }; + 594F0A361FD23228007FBE96 /* RCTSurfaceSizeMeasureMode.h in Headers */ = {isa = PBXBuildFile; fileRef = 594F0A311FD23228007FBE96 /* RCTSurfaceSizeMeasureMode.h */; }; + 594F0A371FD23228007FBE96 /* RCTSurfaceSizeMeasureMode.h in Headers */ = {isa = PBXBuildFile; fileRef = 594F0A311FD23228007FBE96 /* RCTSurfaceSizeMeasureMode.h */; }; + 594F0A381FD233A2007FBE96 /* RCTSurface.h in Copy Headers */ = {isa = PBXBuildFile; fileRef = 599FAA2A1FB274970058CCF6 /* RCTSurface.h */; }; + 594F0A391FD233A2007FBE96 /* RCTSurfaceDelegate.h in Copy Headers */ = {isa = PBXBuildFile; fileRef = 599FAA2C1FB274970058CCF6 /* RCTSurfaceDelegate.h */; }; + 594F0A3A1FD233A2007FBE96 /* RCTSurfaceRootShadowView.h in Copy Headers */ = {isa = PBXBuildFile; fileRef = 599FAA2D1FB274970058CCF6 /* RCTSurfaceRootShadowView.h */; }; + 594F0A3B1FD233A2007FBE96 /* RCTSurfaceRootShadowViewDelegate.h in Copy Headers */ = {isa = PBXBuildFile; fileRef = 599FAA2F1FB274970058CCF6 /* RCTSurfaceRootShadowViewDelegate.h */; }; + 594F0A3C1FD233A2007FBE96 /* RCTSurfaceRootView.h in Copy Headers */ = {isa = PBXBuildFile; fileRef = 599FAA301FB274970058CCF6 /* RCTSurfaceRootView.h */; }; + 594F0A3D1FD233A2007FBE96 /* RCTSurfaceStage.h in Copy Headers */ = {isa = PBXBuildFile; fileRef = 599FAA321FB274970058CCF6 /* RCTSurfaceStage.h */; }; + 594F0A3E1FD233A2007FBE96 /* RCTSurfaceView.h in Copy Headers */ = {isa = PBXBuildFile; fileRef = 599FAA341FB274970058CCF6 /* RCTSurfaceView.h */; }; + 594F0A3F1FD233A2007FBE96 /* RCTSurfaceHostingView.h in Copy Headers */ = {isa = PBXBuildFile; fileRef = 594F0A2F1FD23228007FBE96 /* RCTSurfaceHostingView.h */; }; + 594F0A401FD233A2007FBE96 /* RCTSurfaceSizeMeasureMode.h in Copy Headers */ = {isa = PBXBuildFile; fileRef = 594F0A311FD23228007FBE96 /* RCTSurfaceSizeMeasureMode.h */; }; + 594F0A411FD233BD007FBE96 /* RCTSurface.h in Copy Headers */ = {isa = PBXBuildFile; fileRef = 599FAA2A1FB274970058CCF6 /* RCTSurface.h */; }; + 594F0A421FD233BD007FBE96 /* RCTSurfaceDelegate.h in Copy Headers */ = {isa = PBXBuildFile; fileRef = 599FAA2C1FB274970058CCF6 /* RCTSurfaceDelegate.h */; }; + 594F0A431FD233BD007FBE96 /* RCTSurfaceRootShadowView.h in Copy Headers */ = {isa = PBXBuildFile; fileRef = 599FAA2D1FB274970058CCF6 /* RCTSurfaceRootShadowView.h */; }; + 594F0A441FD233BD007FBE96 /* RCTSurfaceRootShadowViewDelegate.h in Copy Headers */ = {isa = PBXBuildFile; fileRef = 599FAA2F1FB274970058CCF6 /* RCTSurfaceRootShadowViewDelegate.h */; }; + 594F0A451FD233BD007FBE96 /* RCTSurfaceRootView.h in Copy Headers */ = {isa = PBXBuildFile; fileRef = 599FAA301FB274970058CCF6 /* RCTSurfaceRootView.h */; }; + 594F0A461FD233BD007FBE96 /* RCTSurfaceStage.h in Copy Headers */ = {isa = PBXBuildFile; fileRef = 599FAA321FB274970058CCF6 /* RCTSurfaceStage.h */; }; + 594F0A471FD233BD007FBE96 /* RCTSurfaceView.h in Copy Headers */ = {isa = PBXBuildFile; fileRef = 599FAA341FB274970058CCF6 /* RCTSurfaceView.h */; }; + 594F0A481FD233BD007FBE96 /* RCTSurfaceHostingView.h in Copy Headers */ = {isa = PBXBuildFile; fileRef = 594F0A2F1FD23228007FBE96 /* RCTSurfaceHostingView.h */; }; + 594F0A491FD233BD007FBE96 /* RCTSurfaceSizeMeasureMode.h in Copy Headers */ = {isa = PBXBuildFile; fileRef = 594F0A311FD23228007FBE96 /* RCTSurfaceSizeMeasureMode.h */; }; 59500D431F71C63F00B122B7 /* RCTUIManagerUtils.h in Headers */ = {isa = PBXBuildFile; fileRef = 59500D411F71C63700B122B7 /* RCTUIManagerUtils.h */; }; 59500D441F71C63F00B122B7 /* RCTUIManagerUtils.h in Headers */ = {isa = PBXBuildFile; fileRef = 59500D411F71C63700B122B7 /* RCTUIManagerUtils.h */; }; 59500D451F71C63F00B122B7 /* RCTUIManagerUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = 59500D421F71C63F00B122B7 /* RCTUIManagerUtils.m */; }; @@ -1307,6 +1331,15 @@ dstPath = include/React; dstSubfolderSpec = 16; files = ( + 594F0A411FD233BD007FBE96 /* RCTSurface.h in Copy Headers */, + 594F0A421FD233BD007FBE96 /* RCTSurfaceDelegate.h in Copy Headers */, + 594F0A431FD233BD007FBE96 /* RCTSurfaceRootShadowView.h in Copy Headers */, + 594F0A441FD233BD007FBE96 /* RCTSurfaceRootShadowViewDelegate.h in Copy Headers */, + 594F0A451FD233BD007FBE96 /* RCTSurfaceRootView.h in Copy Headers */, + 594F0A461FD233BD007FBE96 /* RCTSurfaceStage.h in Copy Headers */, + 594F0A471FD233BD007FBE96 /* RCTSurfaceView.h in Copy Headers */, + 594F0A481FD233BD007FBE96 /* RCTSurfaceHostingView.h in Copy Headers */, + 594F0A491FD233BD007FBE96 /* RCTSurfaceSizeMeasureMode.h in Copy Headers */, 2D16E68E1FA4FD3900B85C8A /* RCTTVNavigationEventEmitter.h in Copy Headers */, 59500D481F71C67600B122B7 /* RCTUIManagerUtils.h in Copy Headers */, 3D0E37901F1CC5E100DCAC9F /* RCTWebSocketModule.h in Copy Headers */, @@ -1529,6 +1562,15 @@ dstPath = include/React; dstSubfolderSpec = 16; files = ( + 594F0A381FD233A2007FBE96 /* RCTSurface.h in Copy Headers */, + 594F0A391FD233A2007FBE96 /* RCTSurfaceDelegate.h in Copy Headers */, + 594F0A3A1FD233A2007FBE96 /* RCTSurfaceRootShadowView.h in Copy Headers */, + 594F0A3B1FD233A2007FBE96 /* RCTSurfaceRootShadowViewDelegate.h in Copy Headers */, + 594F0A3C1FD233A2007FBE96 /* RCTSurfaceRootView.h in Copy Headers */, + 594F0A3D1FD233A2007FBE96 /* RCTSurfaceStage.h in Copy Headers */, + 594F0A3E1FD233A2007FBE96 /* RCTSurfaceView.h in Copy Headers */, + 594F0A3F1FD233A2007FBE96 /* RCTSurfaceHostingView.h in Copy Headers */, + 594F0A401FD233A2007FBE96 /* RCTSurfaceSizeMeasureMode.h in Copy Headers */, 59500D471F71C66700B122B7 /* RCTUIManagerUtils.h in Copy Headers */, 3D0E378F1F1CC5CF00DCAC9F /* RCTWebSocketModule.h in Copy Headers */, 5960C1BD1F0804DF0066FD5B /* RCTLayoutAnimation.h in Copy Headers */, @@ -2108,6 +2150,9 @@ 58C571C01AA56C1900CDF9C8 /* RCTDatePickerManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; lineEnding = 0; path = RCTDatePickerManager.h; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; }; 590D7BFB1EBD458B00D8A370 /* RCTShadowView+Layout.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "RCTShadowView+Layout.h"; sourceTree = ""; }; 590D7BFC1EBD458B00D8A370 /* RCTShadowView+Layout.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "RCTShadowView+Layout.m"; sourceTree = ""; }; + 594F0A2F1FD23228007FBE96 /* RCTSurfaceHostingView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RCTSurfaceHostingView.h; sourceTree = ""; }; + 594F0A301FD23228007FBE96 /* RCTSurfaceHostingView.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = RCTSurfaceHostingView.mm; sourceTree = ""; }; + 594F0A311FD23228007FBE96 /* RCTSurfaceSizeMeasureMode.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RCTSurfaceSizeMeasureMode.h; sourceTree = ""; }; 59500D411F71C63700B122B7 /* RCTUIManagerUtils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RCTUIManagerUtils.h; sourceTree = ""; }; 59500D421F71C63F00B122B7 /* RCTUIManagerUtils.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RCTUIManagerUtils.m; sourceTree = ""; }; 5960C1B11F0804A00066FD5B /* RCTLayoutAnimation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RCTLayoutAnimation.h; sourceTree = ""; }; @@ -2702,6 +2747,16 @@ name = Frameworks; sourceTree = ""; }; + 594F0A2E1FD23228007FBE96 /* SurfaceHostingView */ = { + isa = PBXGroup; + children = ( + 594F0A2F1FD23228007FBE96 /* RCTSurfaceHostingView.h */, + 594F0A301FD23228007FBE96 /* RCTSurfaceHostingView.mm */, + 594F0A311FD23228007FBE96 /* RCTSurfaceSizeMeasureMode.h */, + ); + path = SurfaceHostingView; + sourceTree = ""; + }; 599FAA291FB274970058CCF6 /* Surface */ = { isa = PBXGroup; children = ( @@ -2714,9 +2769,10 @@ 599FAA301FB274970058CCF6 /* RCTSurfaceRootView.h */, 599FAA311FB274970058CCF6 /* RCTSurfaceRootView.mm */, 599FAA321FB274970058CCF6 /* RCTSurfaceStage.h */, - 599FAA331FB274970058CCF6 /* RCTSurfaceView+Internal.h */, 599FAA341FB274970058CCF6 /* RCTSurfaceView.h */, 599FAA351FB274970058CCF6 /* RCTSurfaceView.mm */, + 599FAA331FB274970058CCF6 /* RCTSurfaceView+Internal.h */, + 594F0A2E1FD23228007FBE96 /* SurfaceHostingView */, ); path = Surface; sourceTree = ""; @@ -3024,6 +3080,7 @@ 3D302F351DF828F800D6DDAE /* RCTErrorCustomizer.h in Headers */, 3D302F361DF828F800D6DDAE /* RCTErrorInfo.h in Headers */, 3D302F371DF828F800D6DDAE /* RCTEventDispatcher.h in Headers */, + 594F0A371FD23228007FBE96 /* RCTSurfaceSizeMeasureMode.h in Headers */, 3D302F381DF828F800D6DDAE /* RCTFrameUpdate.h in Headers */, 3D302F391DF828F800D6DDAE /* RCTImageSource.h in Headers */, 597633391F4E021D005BE8A4 /* RCTShadowView+Internal.h in Headers */, @@ -3103,6 +3160,7 @@ 1384E20A1E806D5700545659 /* RCTNativeModule.h in Headers */, 3D302F7C1DF828F800D6DDAE /* RCTModalHostViewController.h in Headers */, 3D302F7D1DF828F800D6DDAE /* RCTModalHostViewManager.h in Headers */, + 594F0A331FD23228007FBE96 /* RCTSurfaceHostingView.h in Headers */, 3D302F7E1DF828F800D6DDAE /* RCTNavigator.h in Headers */, 3D302F7F1DF828F800D6DDAE /* RCTNavigatorManager.h in Headers */, 130443DD1E401AF500D93A67 /* RCTConvert+Transform.h in Headers */, @@ -3344,6 +3402,7 @@ 3D80DA361DF820620028D040 /* RCTModuleMethod.h in Headers */, 3D80DA371DF820620028D040 /* RCTMultipartDataTask.h in Headers */, 3D80DA381DF820620028D040 /* RCTMultipartStreamReader.h in Headers */, + 594F0A361FD23228007FBE96 /* RCTSurfaceSizeMeasureMode.h in Headers */, 53D123B21FBF220F001B8A10 /* Yoga.h in Headers */, 3D80DA391DF820620028D040 /* RCTNullability.h in Headers */, 3D80DA3A1DF820620028D040 /* RCTParserUtils.h in Headers */, @@ -3416,6 +3475,7 @@ 13134C9C1E296B2A00B9F3CB /* RCTCxxModule.h in Headers */, 3D80DA731DF820620028D040 /* RCTNavigator.h in Headers */, 3D80DA741DF820620028D040 /* RCTNavigatorManager.h in Headers */, + 594F0A321FD23228007FBE96 /* RCTSurfaceHostingView.h in Headers */, 3D80DA751DF820620028D040 /* RCTNavItem.h in Headers */, 3D80DA761DF820620028D040 /* RCTNavItemManager.h in Headers */, 3D80DA771DF820620028D040 /* RCTPicker.h in Headers */, @@ -4035,6 +4095,7 @@ 2D3B5EED1D9B09D700451313 /* RCTTabBarManager.m in Sources */, 2D3B5EEF1D9B09DC00451313 /* RCTViewManager.m in Sources */, 13134C971E296B2A00B9F3CB /* RCTObjcExecutor.mm in Sources */, + 594F0A351FD23228007FBE96 /* RCTSurfaceHostingView.mm in Sources */, 2D3B5EE11D9B09B000451313 /* RCTScrollView.m in Sources */, 130E3D8B1E6A083900ACE484 /* RCTDevSettings.mm in Sources */, 2D3B5ED81D9B098A00451313 /* RCTNavigatorManager.m in Sources */, @@ -4265,6 +4326,7 @@ 001BFCD01D8381DE008E587E /* RCTMultipartStreamReader.m in Sources */, 133CAE8E1B8E5CFD00F6AD92 /* RCTDatePicker.m in Sources */, 14C2CA761B3AC64F00E6CBB2 /* RCTFrameUpdate.m in Sources */, + 594F0A341FD23228007FBE96 /* RCTSurfaceHostingView.mm in Sources */, 13134C861E296B2A00B9F3CB /* RCTCxxBridge.mm in Sources */, 13B07FEF1A69327A00A75B9A /* RCTAlertManager.m in Sources */, 599FAA4C1FB274980058CCF6 /* RCTSurfaceView.mm in Sources */,