Fabric: Wiring layout pipeline between Surface and ShadowTree
Summary: The layout pipeline is quite long: UIKit <-> Surface <-> SurfacePresenter <-> [RCTScheduler <|-|> Scheduler] <-> ShadowTree <-> RootShadowNode <-> YogaNode. Reviewed By: mdvacca Differential Revision: D7857048 fbshipit-source-id: 06c92ef1639465d17e2489667f99d0114b80dcff
This commit is contained in:
parent
20e88e9ac4
commit
67dbcbd57e
|
@ -9,6 +9,8 @@
|
|||
#import <memory>
|
||||
|
||||
#import <React/RCTPrimitives.h>
|
||||
#import <fabric/core/LayoutConstraints.h>
|
||||
#import <fabric/core/LayoutContext.h>
|
||||
#import <fabric/uimanager/FabricUIManager.h>
|
||||
#import <fabric/uimanager/TreeMutationInstruction.h>
|
||||
|
||||
|
@ -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)
|
||||
|
|
|
@ -10,6 +10,8 @@
|
|||
#import <fabric/uimanager/Scheduler.h>
|
||||
#import <fabric/uimanager/SchedulerDelegate.h>
|
||||
|
||||
#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)
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -19,6 +19,11 @@
|
|||
#import <React/RCTSurfaceView.h>
|
||||
#import <React/RCTSurfaceView+Internal.h>
|
||||
|
||||
#import <fabric/core/LayoutContext.h>
|
||||
#import <fabric/core/LayoutConstraints.h>
|
||||
|
||||
#import "RCTConversions.h"
|
||||
|
||||
using namespace facebook::react;
|
||||
|
||||
@interface RCTSurfacePresenter () <RCTSchedulerDelegate, RCTMountingManagerDelegate>
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue