Skip to content

Commit f91f7d9

Browse files
sherginfacebook-github-bot
authored andcommitted
Reimagining of RCTShadowView layout API
Summary: This is reimagining of interoperability layer between Yoga and ShadowViews (at least in Yoga -> RN part). Goals: * Make it clear and easy. * Make clear separation between "what layout what", now parent always layout children, noone layout itself. * Make possible to interleave Yoga layout with custom imperative layout (may be used in SafeAreaView, Text, Modal, InputAccessoryView and so on). Reviewed By: mmmulani Differential Revision: D6863654 fbshipit-source-id: 5a6a933874f121d46f744aab99a31ae42ddd4a1b
1 parent 47b36d3 commit f91f7d9

File tree

17 files changed

+469
-309
lines changed

17 files changed

+469
-309
lines changed

Libraries/Text/Text/RCTTextShadowView.m

Lines changed: 19 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -235,40 +235,24 @@ - (NSTextStorage *)textStorageAndLayoutManagerThatFitsSize:(CGSize)size
235235
return textStorage;
236236
}
237237

238-
- (void)applyLayoutNode:(YGNodeRef)node
239-
viewsWithNewFrame:(NSMutableSet<RCTShadowView *> *)viewsWithNewFrame
240-
absolutePosition:(CGPoint)absolutePosition
238+
- (void)layoutWithMetrics:(RCTLayoutMetrics)layoutMetrics
239+
layoutContext:(RCTLayoutContext)layoutContext
241240
{
242-
if (YGNodeGetHasNewLayout(self.yogaNode)) {
243-
// If the view got new layout, we have to redraw it because `contentFrame`
244-
// and sizes of embedded views may change.
241+
// If the view got new `contentFrame`, we have to redraw it because
242+
// and sizes of embedded views may change.
243+
if (!CGRectEqualToRect(self.layoutMetrics.contentFrame, layoutMetrics.contentFrame)) {
245244
_needsUpdateView = YES;
246245
}
247246

248-
[super applyLayoutNode:node
249-
viewsWithNewFrame:viewsWithNewFrame
250-
absolutePosition:absolutePosition];
251-
}
252-
253-
- (void)applyLayoutWithFrame:(CGRect)frame
254-
layoutDirection:(UIUserInterfaceLayoutDirection)layoutDirection
255-
viewsWithUpdatedLayout:(NSMutableSet<RCTShadowView *> *)viewsWithUpdatedLayout
256-
absolutePosition:(CGPoint)absolutePosition
257-
{
258-
if (self.textAttributes.layoutDirection != layoutDirection) {
259-
self.textAttributes.layoutDirection = layoutDirection;
247+
if (self.textAttributes.layoutDirection != layoutMetrics.layoutDirection) {
248+
self.textAttributes.layoutDirection = layoutMetrics.layoutDirection;
260249
[self invalidateCache];
261250
}
262251

263-
[super applyLayoutWithFrame:frame
264-
layoutDirection:layoutDirection
265-
viewsWithUpdatedLayout:viewsWithUpdatedLayout
266-
absolutePosition:absolutePosition];
252+
[super layoutWithMetrics:layoutMetrics layoutContext:layoutContext];
267253
}
268254

269-
- (void)applyLayoutToChildren:(YGNodeRef)node
270-
viewsWithNewFrame:(NSMutableSet<RCTShadowView *> *)viewsWithNewFrame
271-
absolutePosition:(CGPoint)absolutePosition
255+
- (void)layoutSubviewsWithContext:(RCTLayoutContext)layoutContext
272256
{
273257
NSTextStorage *textStorage =
274258
[self textStorageAndLayoutManagerThatFitsSize:self.availableSize
@@ -280,9 +264,9 @@ - (void)applyLayoutToChildren:(YGNodeRef)node
280264
actualGlyphRange:NULL];
281265

282266
[textStorage enumerateAttribute:RCTBaseTextShadowViewEmbeddedShadowViewAttributeName
283-
inRange:characterRange
284-
options:0
285-
usingBlock:
267+
inRange:characterRange
268+
options:0
269+
usingBlock:
286270
^(RCTShadowView *shadowView, NSRange range, BOOL *stop) {
287271
if (!shadowView) {
288272
return;
@@ -306,18 +290,14 @@ - (void)applyLayoutToChildren:(YGNodeRef)node
306290
RCTRoundPixelValue(attachmentSize.height)
307291
}};
308292

309-
UIUserInterfaceLayoutDirection layoutDirection = self.textAttributes.layoutDirection;
310-
311-
YGNodeCalculateLayout(
312-
shadowView.yogaNode,
313-
frame.size.width,
314-
frame.size.height,
315-
layoutDirection == UIUserInterfaceLayoutDirectionLeftToRight ? YGDirectionLTR : YGDirectionRTL);
293+
RCTLayoutContext localLayoutContext = layoutContext;
294+
localLayoutContext.absolutePosition.x += frame.origin.x;
295+
localLayoutContext.absolutePosition.y += frame.origin.y;
316296

317-
[shadowView applyLayoutWithFrame:frame
318-
layoutDirection:layoutDirection
319-
viewsWithUpdatedLayout:viewsWithNewFrame
320-
absolutePosition:absolutePosition];
297+
[shadowView layoutWithMinimumSize:frame.size
298+
maximumSize:frame.size
299+
layoutDirection:self.layoutMetrics.layoutDirection
300+
layoutContext:localLayoutContext];
321301
}
322302
];
323303
}

Libraries/Text/TextInput/RCTBaseTextInputShadowView.m

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,11 @@ - (BOOL)isYogaLeafNode
4747
return YES;
4848
}
4949

50+
- (void)layoutSubviewsWithContext:(RCTLayoutContext)layoutContext
51+
{
52+
// Do nothing.
53+
}
54+
5055
- (void)setLocalData:(NSObject *)localData
5156
{
5257
NSAttributedString *attributedText = (NSAttributedString *)localData;
@@ -73,7 +78,7 @@ - (void)invalidateContentSize
7378
return;
7479
}
7580

76-
CGSize maximumSize = self.frame.size;
81+
CGSize maximumSize = self.layoutMetrics.frame.size;
7782

7883
if (_maximumNumberOfLines == 1) {
7984
maximumSize.width = CGFLOAT_MAX;

RNTester/RNTester.xcodeproj/project.pbxproj

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -889,13 +889,6 @@
889889
name = Products;
890890
sourceTree = "<group>";
891891
};
892-
19BA89021F8439A700741C5A /* Frameworks */ = {
893-
isa = PBXGroup;
894-
children = (
895-
);
896-
name = Frameworks;
897-
sourceTree = "<group>";
898-
};
899892
272E6B3A1BEA846C001FCF37 /* NativeExampleViews */ = {
900893
isa = PBXGroup;
901894
children = (
@@ -1157,6 +1150,9 @@
11571150
004D289D1AAF61C70097A701 = {
11581151
CreatedOnToolsVersion = 6.1.1;
11591152
};
1153+
13B07F861A680F5B00A75B9A = {
1154+
DevelopmentTeam = V9WTTPBFK9;
1155+
};
11601156
143BC5941B21E3E100462512 = {
11611157
CreatedOnToolsVersion = 6.3.2;
11621158
TestTargetID = 13B07F861A680F5B00A75B9A;
@@ -1854,6 +1850,7 @@
18541850
isa = XCBuildConfiguration;
18551851
buildSettings = {
18561852
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
1853+
DEVELOPMENT_TEAM = V9WTTPBFK9;
18571854
INFOPLIST_FILE = "$(SRCROOT)/RNTester/Info.plist";
18581855
IPHONEOS_DEPLOYMENT_TARGET = 9.3;
18591856
LIBRARY_SEARCH_PATHS = "$(inherited)";

RNTester/RNTesterUnitTests/RCTShadowViewTests.m

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ - (void)testApplyingLayoutRecursivelyToShadowView
8888
[self.parentView insertReactSubview:mainView atIndex:1];
8989
[self.parentView insertReactSubview:footerView atIndex:2];
9090

91-
[self.parentView collectViewsWithUpdatedFrames];
91+
[self.parentView layoutWithAffectedShadowViews:[NSHashTable weakObjectsHashTable]];
9292

9393
XCTAssertTrue(CGRectEqualToRect([self.parentView measureLayoutRelativeToAncestor:self.parentView], CGRectMake(0, 0, 440, 440)));
9494
XCTAssertTrue(UIEdgeInsetsEqualToEdgeInsets([self.parentView paddingAsInsets], UIEdgeInsetsMake(10, 10, 10, 10)));
@@ -180,7 +180,7 @@ - (void)_withShadowViewWithStyle:(void(^)(YGNodeRef node))configBlock
180180
RCTShadowView *view = [self _shadowViewWithConfig:configBlock];
181181
[self.parentView insertReactSubview:view atIndex:0];
182182
view.intrinsicContentSize = contentSize;
183-
[self.parentView collectViewsWithUpdatedFrames];
183+
[self.parentView layoutWithAffectedShadowViews:[NSHashTable weakObjectsHashTable]];
184184
CGRect actualRect = [view measureLayoutRelativeToAncestor:self.parentView];
185185
XCTAssertTrue(CGRectEqualToRect(expectedRect, actualRect),
186186
@"Expected layout to be %@, got %@",

React/Base/Surface/RCTSurfaceRootShadowView.h

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -29,10 +29,6 @@
2929
*/
3030
@property (nonatomic, assign) YGDirection baseDirection;
3131

32-
/**
33-
* Calculate all views whose frame needs updating after layout has been calculated.
34-
* Returns a set contains the shadowviews that need updating.
35-
*/
36-
- (NSSet<RCTShadowView *> *)collectViewsWithUpdatedFrames;
32+
- (void)layoutWithAffectedShadowViews:(NSHashTable<RCTShadowView *> *)affectedShadowViews;
3733

3834
@end

React/Base/Surface/RCTSurfaceRootShadowView.m

Lines changed: 11 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -43,37 +43,26 @@ - (void)insertReactSubview:(RCTShadowView *)subview atIndex:(NSInteger)atIndex
4343
}
4444
}
4545

46-
- (void)calculateLayoutWithMinimumSize:(CGSize)minimumSize maximumSize:(CGSize)maximumSize
46+
- (void)layoutWithAffectedShadowViews:(NSHashTable<RCTShadowView *> *)affectedShadowViews
4747
{
48-
YGNodeRef yogaNode = self.yogaNode;
48+
NSHashTable<NSString *> *other = [NSHashTable new];
4949

50-
YGNodeStyleSetMinWidth(yogaNode, RCTYogaFloatFromCoreGraphicsFloat(minimumSize.width));
51-
YGNodeStyleSetMinHeight(yogaNode, RCTYogaFloatFromCoreGraphicsFloat(minimumSize.height));
50+
RCTLayoutContext layoutContext = {};
51+
layoutContext.absolutePosition = CGPointZero;
52+
layoutContext.affectedShadowViews = affectedShadowViews;
53+
layoutContext.other = other;
5254

53-
YGNodeCalculateLayout(
54-
self.yogaNode,
55-
RCTYogaFloatFromCoreGraphicsFloat(maximumSize.width),
56-
RCTYogaFloatFromCoreGraphicsFloat(maximumSize.height),
57-
_baseDirection
58-
);
59-
}
60-
61-
- (NSSet<RCTShadowView *> *)collectViewsWithUpdatedFrames
62-
{
63-
[self calculateLayoutWithMinimumSize:_minimumSize
64-
maximumSize:_maximumSize];
55+
[self layoutWithMinimumSize:_minimumSize
56+
maximumSize:_maximumSize
57+
layoutDirection:RCTUIKitLayoutDirectionFromYogaLayoutDirection(_baseDirection)
58+
layoutContext:layoutContext];
6559

66-
NSMutableSet<RCTShadowView *> *viewsWithNewFrame = [NSMutableSet set];
67-
[self applyLayoutNode:self.yogaNode viewsWithNewFrame:viewsWithNewFrame absolutePosition:CGPointZero];
68-
69-
self.intrinsicSize = self.frame.size;
60+
self.intrinsicSize = self.layoutMetrics.frame.size;
7061

7162
if (_isRendered && !_isLaidOut) {
7263
[_delegate rootShadowViewDidStartLayingOut:self];
7364
_isLaidOut = YES;
7465
}
75-
76-
return viewsWithNewFrame;
7766
}
7867

7968
- (void)setMinimumSize:(CGSize)minimumSize maximumSize:(CGSize)maximumSize

React/Modules/RCTUIManager.m

Lines changed: 12 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -479,14 +479,10 @@ - (RCTViewManagerUIBlock)uiBlockWithLayoutUpdateForRootView:(RCTRootShadowView *
479479
{
480480
RCTAssertUIManagerQueue();
481481

482-
// This is nuanced. In the JS thread, we create a new update buffer
483-
// `frameTags`/`frames` that is created/mutated in the JS thread. We access
484-
// these structures in the UI-thread block. `NSMutableArray` is not thread
485-
// safe so we rely on the fact that we never mutate it after it's passed to
486-
// the main thread.
487-
NSSet<RCTShadowView *> *viewsWithNewFrames = [rootShadowView collectViewsWithUpdatedFrames];
488-
489-
if (!viewsWithNewFrames.count) {
482+
NSHashTable<RCTShadowView *> *affectedShadowViews = [NSHashTable weakObjectsHashTable];
483+
[rootShadowView layoutWithAffectedShadowViews:affectedShadowViews];
484+
485+
if (!affectedShadowViews.count) {
490486
// no frame change results in no UI update block
491487
return nil;
492488
}
@@ -499,32 +495,33 @@ - (RCTViewManagerUIBlock)uiBlockWithLayoutUpdateForRootView:(RCTRootShadowView *
499495
} RCTFrameData;
500496

501497
// Construct arrays then hand off to main thread
502-
NSUInteger count = viewsWithNewFrames.count;
498+
NSUInteger count = affectedShadowViews.count;
503499
NSMutableArray *reactTags = [[NSMutableArray alloc] initWithCapacity:count];
504500
NSMutableData *framesData = [[NSMutableData alloc] initWithLength:sizeof(RCTFrameData) * count];
505501
{
506502
NSUInteger index = 0;
507503
RCTFrameData *frameDataArray = (RCTFrameData *)framesData.mutableBytes;
508-
for (RCTShadowView *shadowView in viewsWithNewFrames) {
504+
for (RCTShadowView *shadowView in affectedShadowViews) {
509505
reactTags[index] = shadowView.reactTag;
506+
RCTLayoutMetrics layoutMetrics = shadowView.layoutMetrics;
510507
frameDataArray[index++] = (RCTFrameData){
511-
shadowView.frame,
512-
shadowView.layoutDirection,
508+
layoutMetrics.frame,
509+
layoutMetrics.layoutDirection,
513510
shadowView.isNewView,
514511
shadowView.superview.isNewView,
515512
};
516513
}
517514
}
518515

519-
for (RCTShadowView *shadowView in viewsWithNewFrames) {
516+
for (RCTShadowView *shadowView in affectedShadowViews) {
520517

521518
// We have to do this after we build the parentsAreNew array.
522519
shadowView.newView = NO;
523520

524521
NSNumber *reactTag = shadowView.reactTag;
525522

526523
if (shadowView.onLayout) {
527-
CGRect frame = shadowView.frame;
524+
CGRect frame = shadowView.layoutMetrics.frame;
528525
shadowView.onLayout(@{
529526
@"layout": @{
530527
@"x": @(frame.origin.x),
@@ -539,7 +536,7 @@ - (RCTViewManagerUIBlock)uiBlockWithLayoutUpdateForRootView:(RCTRootShadowView *
539536
RCTIsReactRootView(reactTag) &&
540537
[shadowView isKindOfClass:[RCTRootShadowView class]]
541538
) {
542-
CGSize contentSize = shadowView.frame.size;
539+
CGSize contentSize = shadowView.layoutMetrics.frame.size;
543540

544541
RCTExecuteOnMainQueue(^{
545542
UIView *view = self->_viewRegistry[reactTag];

React/React.xcodeproj/project.pbxproj

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -978,6 +978,12 @@
978978
590D7BFE1EBD458B00D8A370 /* RCTShadowView+Layout.h in Headers */ = {isa = PBXBuildFile; fileRef = 590D7BFB1EBD458B00D8A370 /* RCTShadowView+Layout.h */; };
979979
590D7BFF1EBD458B00D8A370 /* RCTShadowView+Layout.m in Sources */ = {isa = PBXBuildFile; fileRef = 590D7BFC1EBD458B00D8A370 /* RCTShadowView+Layout.m */; };
980980
590D7C001EBD458B00D8A370 /* RCTShadowView+Layout.m in Sources */ = {isa = PBXBuildFile; fileRef = 590D7BFC1EBD458B00D8A370 /* RCTShadowView+Layout.m */; };
981+
591F78DA202ADB22004A668C /* RCTLayout.m in Sources */ = {isa = PBXBuildFile; fileRef = 591F78D8202ADB21004A668C /* RCTLayout.m */; };
982+
591F78DB202ADB22004A668C /* RCTLayout.m in Sources */ = {isa = PBXBuildFile; fileRef = 591F78D8202ADB21004A668C /* RCTLayout.m */; };
983+
591F78DC202ADB22004A668C /* RCTLayout.h in Headers */ = {isa = PBXBuildFile; fileRef = 591F78D9202ADB22004A668C /* RCTLayout.h */; };
984+
591F78DD202ADB22004A668C /* RCTLayout.h in Headers */ = {isa = PBXBuildFile; fileRef = 591F78D9202ADB22004A668C /* RCTLayout.h */; };
985+
591F78DE202ADB8F004A668C /* RCTLayout.h in Copy Headers */ = {isa = PBXBuildFile; fileRef = 591F78D9202ADB22004A668C /* RCTLayout.h */; };
986+
591F78DF202ADB97004A668C /* RCTLayout.h in Copy Headers */ = {isa = PBXBuildFile; fileRef = 591F78D9202ADB22004A668C /* RCTLayout.h */; };
981987
5925356A20084D0600DD584B /* RCTSurfaceSizeMeasureMode.mm in Sources */ = {isa = PBXBuildFile; fileRef = 5925356920084D0600DD584B /* RCTSurfaceSizeMeasureMode.mm */; };
982988
5925356B20084D0600DD584B /* RCTSurfaceSizeMeasureMode.mm in Sources */ = {isa = PBXBuildFile; fileRef = 5925356920084D0600DD584B /* RCTSurfaceSizeMeasureMode.mm */; };
983989
59283CA01FD67321000EAAB9 /* RCTSurfaceStage.m in Sources */ = {isa = PBXBuildFile; fileRef = 59283C9F1FD67320000EAAB9 /* RCTSurfaceStage.m */; };
@@ -1347,6 +1353,7 @@
13471353
dstPath = include/React;
13481354
dstSubfolderSpec = 16;
13491355
files = (
1356+
591F78DF202ADB97004A668C /* RCTLayout.h in Copy Headers */,
13501357
59EDBCC31FDF4E55003573DE /* RCTScrollableProtocol.h in Copy Headers */,
13511358
59EDBCC41FDF4E55003573DE /* (null) in Copy Headers */,
13521359
59EDBCC51FDF4E55003573DE /* RCTScrollContentView.h in Copy Headers */,
@@ -1574,6 +1581,7 @@
15741581
dstPath = include/React;
15751582
dstSubfolderSpec = 16;
15761583
files = (
1584+
591F78DE202ADB8F004A668C /* RCTLayout.h in Copy Headers */,
15771585
59EDBCBD1FDF4E43003573DE /* RCTScrollableProtocol.h in Copy Headers */,
15781586
59EDBCBE1FDF4E43003573DE /* (null) in Copy Headers */,
15791587
59EDBCBF1FDF4E43003573DE /* RCTScrollContentView.h in Copy Headers */,
@@ -2156,6 +2164,8 @@
21562164
58C571C01AA56C1900CDF9C8 /* RCTDatePickerManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; lineEnding = 0; path = RCTDatePickerManager.h; sourceTree = "<group>"; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; };
21572165
590D7BFB1EBD458B00D8A370 /* RCTShadowView+Layout.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "RCTShadowView+Layout.h"; sourceTree = "<group>"; };
21582166
590D7BFC1EBD458B00D8A370 /* RCTShadowView+Layout.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "RCTShadowView+Layout.m"; sourceTree = "<group>"; };
2167+
591F78D8202ADB21004A668C /* RCTLayout.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RCTLayout.m; sourceTree = "<group>"; };
2168+
591F78D9202ADB22004A668C /* RCTLayout.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RCTLayout.h; sourceTree = "<group>"; };
21592169
5925356920084D0600DD584B /* RCTSurfaceSizeMeasureMode.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = RCTSurfaceSizeMeasureMode.mm; sourceTree = "<group>"; };
21602170
59283C9F1FD67320000EAAB9 /* RCTSurfaceStage.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RCTSurfaceStage.m; sourceTree = "<group>"; };
21612171
594F0A2F1FD23228007FBE96 /* RCTSurfaceHostingView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RCTSurfaceHostingView.h; sourceTree = "<group>"; };
@@ -2536,6 +2546,8 @@
25362546
58C571BF1AA56C1900CDF9C8 /* RCTDatePickerManager.m */,
25372547
3D37B5801D522B190042D5B5 /* RCTFont.h */,
25382548
3D37B5811D522B190042D5B5 /* RCTFont.mm */,
2549+
591F78D9202ADB22004A668C /* RCTLayout.h */,
2550+
591F78D8202ADB21004A668C /* RCTLayout.m */,
25392551
66CD94AD1F1045E700CB3C7C /* RCTMaskedView.h */,
25402552
66CD94AE1F1045E700CB3C7C /* RCTMaskedView.m */,
25412553
66CD94AF1F1045E700CB3C7C /* RCTMaskedViewManager.h */,
@@ -3151,6 +3163,7 @@
31513163
3D302F4A1DF828F800D6DDAE /* RCTRootViewInternal.h in Headers */,
31523164
59EDBCB21FDF4E0C003573DE /* (null) in Headers */,
31533165
3D302F4B1DF828F800D6DDAE /* RCTTouchEvent.h in Headers */,
3166+
591F78DD202ADB22004A668C /* RCTLayout.h in Headers */,
31543167
59D031F21F8353D3008361F0 /* RCTSafeAreaView.h in Headers */,
31553168
3D302F4C1DF828F800D6DDAE /* RCTTouchHandler.h in Headers */,
31563169
3D302F4D1DF828F800D6DDAE /* RCTURLRequestDelegate.h in Headers */,
@@ -3511,6 +3524,7 @@
35113524
C60128AB1F3D1258009DF9FF /* RCTCxxConvert.h in Headers */,
35123525
59EDBCAD1FDF4E0C003573DE /* RCTScrollContentView.h in Headers */,
35133526
59EDBCA71FDF4E0C003573DE /* RCTScrollableProtocol.h in Headers */,
3527+
591F78DC202ADB22004A668C /* RCTLayout.h in Headers */,
35143528
3D80DA631DF820620028D040 /* RCTBorderDrawing.h in Headers */,
35153529
3D80DA641DF820620028D040 /* RCTBorderStyle.h in Headers */,
35163530
3D80DA651DF820620028D040 /* RCTComponent.h in Headers */,
@@ -4184,6 +4198,7 @@
41844198
59D031F41F8353D3008361F0 /* RCTSafeAreaView.m in Sources */,
41854199
2D3B5E941D9B087900451313 /* RCTBundleURLProvider.m in Sources */,
41864200
2D3B5EB81D9B091B00451313 /* RCTSourceCode.m in Sources */,
4201+
591F78DB202ADB22004A668C /* RCTLayout.m in Sources */,
41874202
2D3B5EB51D9B091100451313 /* RCTDevMenu.m in Sources */,
41884203
59EDBCAC1FDF4E0C003573DE /* (null) in Sources */,
41894204
2D3B5EBD1D9B092A00451313 /* RCTTiming.m in Sources */,
@@ -4452,6 +4467,7 @@
44524467
1372B70A1AB030C200659ED6 /* RCTAppState.m in Sources */,
44534468
59A7B9FE1E577DBF0068EDBF /* RCTRootContentView.m in Sources */,
44544469
13E067591A70F44B002CDEE1 /* UIView+React.m in Sources */,
4470+
591F78DA202ADB22004A668C /* RCTLayout.m in Sources */,
44554471
FEFAAC9E1FDB89B50057BBE0 /* RCTRedBoxExtraDataViewController.m in Sources */,
44564472
14F484561AABFCE100FDF6B9 /* RCTSliderManager.m in Sources */,
44574473
CF2731C11E7B8DE40044CA4F /* RCTDeviceInfo.m in Sources */,

0 commit comments

Comments
 (0)