123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182 |
- /*
- * Copyright (c) Facebook, Inc. and its affiliates.
- *
- * This source code is licensed under the MIT license found in the
- * LICENSE file in the root directory of this source tree.
- */
- #import "RCTSurfaceHostingProxyRootView.h"
- #import <objc/runtime.h>
- #import "RCTAssert.h"
- #import "RCTBridge.h"
- #import "RCTLog.h"
- #import "RCTPerformanceLogger.h"
- #import "RCTProfile.h"
- #import "RCTRootContentView.h"
- #import "RCTRootViewDelegate.h"
- #import "RCTSurface.h"
- #import "UIView+React.h"
- static RCTSurfaceSizeMeasureMode convertToSurfaceSizeMeasureMode(RCTRootViewSizeFlexibility sizeFlexibility)
- {
- switch (sizeFlexibility) {
- case RCTRootViewSizeFlexibilityWidthAndHeight:
- return RCTSurfaceSizeMeasureModeWidthUndefined | RCTSurfaceSizeMeasureModeHeightUndefined;
- case RCTRootViewSizeFlexibilityWidth:
- return RCTSurfaceSizeMeasureModeWidthUndefined | RCTSurfaceSizeMeasureModeHeightExact;
- case RCTRootViewSizeFlexibilityHeight:
- return RCTSurfaceSizeMeasureModeWidthExact | RCTSurfaceSizeMeasureModeHeightUndefined;
- case RCTRootViewSizeFlexibilityNone:
- return RCTSurfaceSizeMeasureModeWidthExact | RCTSurfaceSizeMeasureModeHeightExact;
- }
- }
- static RCTRootViewSizeFlexibility convertToRootViewSizeFlexibility(RCTSurfaceSizeMeasureMode sizeMeasureMode)
- {
- switch (sizeMeasureMode) {
- case RCTSurfaceSizeMeasureModeWidthUndefined | RCTSurfaceSizeMeasureModeHeightUndefined:
- return RCTRootViewSizeFlexibilityWidthAndHeight;
- case RCTSurfaceSizeMeasureModeWidthUndefined | RCTSurfaceSizeMeasureModeHeightExact:
- return RCTRootViewSizeFlexibilityWidth;
- case RCTSurfaceSizeMeasureModeWidthExact | RCTSurfaceSizeMeasureModeHeightUndefined:
- return RCTRootViewSizeFlexibilityHeight;
- case RCTSurfaceSizeMeasureModeWidthExact | RCTSurfaceSizeMeasureModeHeightExact:
- default:
- return RCTRootViewSizeFlexibilityNone;
- }
- }
- @implementation RCTSurfaceHostingProxyRootView
- - (instancetype)initWithBridge:(RCTBridge *)bridge
- moduleName:(NSString *)moduleName
- initialProperties:(NSDictionary *)initialProperties
- {
- RCTAssertMainQueue();
- RCTAssert(bridge, @"A bridge instance is required to create an RCTSurfaceHostingProxyRootView");
- RCTAssert(moduleName, @"A moduleName is required to create an RCTSurfaceHostingProxyRootView");
- RCT_PROFILE_BEGIN_EVENT(RCTProfileTagAlways, @"-[RCTSurfaceHostingProxyRootView init]", nil);
- _bridge = bridge;
- if (!bridge.isLoading) {
- [bridge.performanceLogger markStartForTag:RCTPLTTI];
- }
- // `RCTRootViewSizeFlexibilityNone` is the RCTRootView's default.
- RCTSurfaceSizeMeasureMode sizeMeasureMode = convertToSurfaceSizeMeasureMode(RCTRootViewSizeFlexibilityNone);
- RCTSurface *surface = [[self class] createSurfaceWithBridge:bridge
- moduleName:moduleName
- initialProperties:initialProperties];
- [surface start];
- if (self = [super initWithSurface:surface sizeMeasureMode:sizeMeasureMode]) {
- self.backgroundColor = [UIColor whiteColor];
- }
- RCT_PROFILE_END_EVENT(RCTProfileTagAlways, @"");
- return self;
- }
- - (instancetype)initWithBundleURL:(NSURL *)bundleURL
- moduleName:(NSString *)moduleName
- initialProperties:(NSDictionary *)initialProperties
- launchOptions:(NSDictionary *)launchOptions
- {
- RCTBridge *bridge = [[RCTBridge alloc] initWithBundleURL:bundleURL moduleProvider:nil launchOptions:launchOptions];
- return [self initWithBridge:bridge moduleName:moduleName initialProperties:initialProperties];
- }
- RCT_NOT_IMPLEMENTED(-(instancetype)initWithFrame : (CGRect)frame)
- RCT_NOT_IMPLEMENTED(-(instancetype)initWithCoder : (NSCoder *)aDecoder)
- #pragma mark proxy methods to RCTSurfaceHostingView
- - (NSString *)moduleName
- {
- return super.surface.moduleName;
- }
- - (UIView *)contentView
- {
- return self;
- }
- - (NSNumber *)reactTag
- {
- return super.surface.rootViewTag;
- }
- - (RCTRootViewSizeFlexibility)sizeFlexibility
- {
- return convertToRootViewSizeFlexibility(super.sizeMeasureMode);
- }
- - (void)setSizeFlexibility:(RCTRootViewSizeFlexibility)sizeFlexibility
- {
- super.sizeMeasureMode = convertToSurfaceSizeMeasureMode(sizeFlexibility);
- }
- - (NSDictionary *)appProperties
- {
- return super.surface.properties;
- }
- - (void)setAppProperties:(NSDictionary *)appProperties
- {
- [super.surface setProperties:appProperties];
- }
- - (UIView *)loadingView
- {
- return super.activityIndicatorViewFactory ? super.activityIndicatorViewFactory() : nil;
- }
- - (void)setLoadingView:(UIView *)loadingView
- {
- super.activityIndicatorViewFactory = ^UIView *(void)
- {
- return loadingView;
- };
- }
- #pragma mark RCTSurfaceDelegate proxying
- - (void)surface:(RCTSurface *)surface didChangeStage:(RCTSurfaceStage)stage
- {
- [super surface:surface didChangeStage:stage];
- if (RCTSurfaceStageIsRunning(stage)) {
- [_bridge.performanceLogger markStopForTag:RCTPLTTI];
- dispatch_async(dispatch_get_main_queue(), ^{
- [[NSNotificationCenter defaultCenter] postNotificationName:RCTContentDidAppearNotification object:self];
- });
- }
- }
- - (void)surface:(RCTSurface *)surface didChangeIntrinsicSize:(CGSize)intrinsicSize
- {
- [super surface:surface didChangeIntrinsicSize:intrinsicSize];
- [_delegate rootViewDidChangeIntrinsicSize:(RCTRootView *)self];
- }
- #pragma mark legacy
- - (UIViewController *)reactViewController
- {
- return _reactViewController ?: [super reactViewController];
- }
- #pragma mark unsupported
- - (void)cancelTouches
- {
- // Not supported.
- }
- @end
|