diff --git a/React/Fabric/RCTScheduler.h b/React/Fabric/RCTScheduler.h index 1f1e367060f..e6a730b788c 100644 --- a/React/Fabric/RCTScheduler.h +++ b/React/Fabric/RCTScheduler.h @@ -9,6 +9,8 @@ #import #import +#import +#import #import #import @@ -38,6 +40,14 @@ NS_ASSUME_NONNULL_BEGIN - (void)unregisterRootTag:(ReactTag)tag; +- (CGSize)measureWithLayoutConstraints:(facebook::react::LayoutConstraints)layoutConstraints + layoutContext:(facebook::react::LayoutContext)layoutContext + rootTag:(ReactTag)rootTag; + +- (void)constraintLayoutWithLayoutConstraints:(facebook::react::LayoutConstraints)layoutConstraints + layoutContext:(facebook::react::LayoutContext)layoutContext + rootTag:(ReactTag)rootTag; + @end @interface RCTScheduler (Deprecated) diff --git a/React/Fabric/RCTScheduler.mm b/React/Fabric/RCTScheduler.mm index 0fe06175ee4..fcd1a9d8b86 100644 --- a/React/Fabric/RCTScheduler.mm +++ b/React/Fabric/RCTScheduler.mm @@ -10,6 +10,8 @@ #import #import +#import "RCTConversions.h" + using namespace facebook::react; class SchedulerDelegateProxy: public SchedulerDelegate { @@ -61,6 +63,20 @@ private: _scheduler->unregisterRootTag(tag); } +- (CGSize)measureWithLayoutConstraints:(LayoutConstraints)layoutConstraints + layoutContext:(LayoutContext)layoutContext + rootTag:(ReactTag)rootTag +{ + return RCTCGSizeFromSize(_scheduler->measure(rootTag, layoutConstraints, layoutContext)); +} + +- (void)constraintLayoutWithLayoutConstraints:(LayoutConstraints)layoutConstraints + layoutContext:(LayoutContext)layoutContext + rootTag:(ReactTag)rootTag +{ + _scheduler->constraintLayout(rootTag, layoutConstraints, layoutContext); +} + @end @implementation RCTScheduler (Deprecated) diff --git a/React/Fabric/RCTSurfacePresenter.h b/React/Fabric/RCTSurfacePresenter.h index d99133d59a9..65456cbf53e 100644 --- a/React/Fabric/RCTSurfacePresenter.h +++ b/React/Fabric/RCTSurfacePresenter.h @@ -29,7 +29,7 @@ NS_ASSUME_NONNULL_BEGIN @end -@interface RCTSurfacePresenter (Internal) +@interface RCTSurfacePresenter (Surface) /** * Surface uses those methods to register itself in the Presenter. @@ -38,6 +38,19 @@ NS_ASSUME_NONNULL_BEGIN - (void)registerSurface:(RCTFabricSurface *)surface; - (void)unregisterSurface:(RCTFabricSurface *)surface; +/** + * Measures the Surface with given constraints. + */ +- (CGSize)sizeThatFitsMinimumSize:(CGSize)minimumSize + maximumSize:(CGSize)maximumSize + surface:(RCTFabricSurface *)surface; + +/** + * Sets `minimumSize` and `maximumSize` layout constraints for the Surface. + */ +- (void)setMinimumSize:(CGSize)minimumSize + maximumSize:(CGSize)maximumSize + surface:(RCTFabricSurface *)surface; @end @interface RCTSurfacePresenter (Deprecated) diff --git a/React/Fabric/RCTSurfacePresenter.mm b/React/Fabric/RCTSurfacePresenter.mm index 8e88548c8d7..1e0164f2b9f 100644 --- a/React/Fabric/RCTSurfacePresenter.mm +++ b/React/Fabric/RCTSurfacePresenter.mm @@ -19,6 +19,11 @@ #import #import +#import +#import + +#import "RCTConversions.h" + using namespace facebook::react; @interface RCTSurfacePresenter () @@ -87,6 +92,34 @@ using namespace facebook::react; [_surfaceRegistry unregisterSurface:surface]; } +- (CGSize)sizeThatFitsMinimumSize:(CGSize)minimumSize + maximumSize:(CGSize)maximumSize + surface:(RCTFabricSurface *)surface +{ + LayoutContext layoutContext; + LayoutConstraints layoutConstraints = {}; + layoutConstraints.minimumSize = RCTSizeFromCGSize(minimumSize); + layoutConstraints.maximumSize = RCTSizeFromCGSize(maximumSize); + + return [_scheduler measureWithLayoutConstraints:layoutConstraints + layoutContext:layoutContext + rootTag:surface.rootTag]; +} + +- (void)setMinimumSize:(CGSize)minimumSize + maximumSize:(CGSize)maximumSize + surface:(RCTFabricSurface *)surface +{ + LayoutContext layoutContext; + LayoutConstraints layoutConstraints = {}; + layoutConstraints.minimumSize = RCTSizeFromCGSize(minimumSize); + layoutConstraints.maximumSize = RCTSizeFromCGSize(maximumSize); + + [_scheduler constraintLayoutWithLayoutConstraints:layoutConstraints + layoutContext:layoutContext + rootTag:surface.rootTag]; +} + - (void)runSurface:(RCTFabricSurface *)surface { NSDictionary *applicationParameters = @{ @@ -122,9 +155,6 @@ using namespace facebook::react; UIView *rootComponentView = [_mountingManager.componentViewRegistry componentViewByTag:rootTag]; - // FIXME: Remove this. - rootComponentView.frame = CGRectMake(0, 0, 400, 400); - surface.view.rootView = (RCTSurfaceRootView *)rootComponentView; } diff --git a/React/Fabric/Surface/RCTFabricSurface.mm b/React/Fabric/Surface/RCTFabricSurface.mm index 060d05675d6..3028a204e97 100644 --- a/React/Fabric/Surface/RCTFabricSurface.mm +++ b/React/Fabric/Surface/RCTFabricSurface.mm @@ -188,8 +188,9 @@ - (CGSize)sizeThatFitsMinimumSize:(CGSize)minimumSize maximumSize:(CGSize)maximumSize { - // TODO: Not supported yet. - return CGSizeZero; + return [_surfacePresenter sizeThatFitsMinimumSize:minimumSize + maximumSize:maximumSize + surface:self]; } #pragma mark - Size Constraints @@ -213,7 +214,9 @@ _minimumSize = minimumSize; } - // TODO: Not supported yet. + return [_surfacePresenter setMinimumSize:minimumSize + maximumSize:maximumSize + surface:self]; } - (CGSize)minimumSize