RCTSurfaceHostingProxyRootView.mm 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  1. /*
  2. * Copyright (c) Facebook, Inc. and its affiliates.
  3. *
  4. * This source code is licensed under the MIT license found in the
  5. * LICENSE file in the root directory of this source tree.
  6. */
  7. #import "RCTSurfaceHostingProxyRootView.h"
  8. #import <objc/runtime.h>
  9. #import "RCTAssert.h"
  10. #import "RCTBridge.h"
  11. #import "RCTLog.h"
  12. #import "RCTPerformanceLogger.h"
  13. #import "RCTProfile.h"
  14. #import "RCTRootContentView.h"
  15. #import "RCTRootViewDelegate.h"
  16. #import "RCTSurface.h"
  17. #import "UIView+React.h"
  18. static RCTSurfaceSizeMeasureMode convertToSurfaceSizeMeasureMode(RCTRootViewSizeFlexibility sizeFlexibility)
  19. {
  20. switch (sizeFlexibility) {
  21. case RCTRootViewSizeFlexibilityWidthAndHeight:
  22. return RCTSurfaceSizeMeasureModeWidthUndefined | RCTSurfaceSizeMeasureModeHeightUndefined;
  23. case RCTRootViewSizeFlexibilityWidth:
  24. return RCTSurfaceSizeMeasureModeWidthUndefined | RCTSurfaceSizeMeasureModeHeightExact;
  25. case RCTRootViewSizeFlexibilityHeight:
  26. return RCTSurfaceSizeMeasureModeWidthExact | RCTSurfaceSizeMeasureModeHeightUndefined;
  27. case RCTRootViewSizeFlexibilityNone:
  28. return RCTSurfaceSizeMeasureModeWidthExact | RCTSurfaceSizeMeasureModeHeightExact;
  29. }
  30. }
  31. static RCTRootViewSizeFlexibility convertToRootViewSizeFlexibility(RCTSurfaceSizeMeasureMode sizeMeasureMode)
  32. {
  33. switch (sizeMeasureMode) {
  34. case RCTSurfaceSizeMeasureModeWidthUndefined | RCTSurfaceSizeMeasureModeHeightUndefined:
  35. return RCTRootViewSizeFlexibilityWidthAndHeight;
  36. case RCTSurfaceSizeMeasureModeWidthUndefined | RCTSurfaceSizeMeasureModeHeightExact:
  37. return RCTRootViewSizeFlexibilityWidth;
  38. case RCTSurfaceSizeMeasureModeWidthExact | RCTSurfaceSizeMeasureModeHeightUndefined:
  39. return RCTRootViewSizeFlexibilityHeight;
  40. case RCTSurfaceSizeMeasureModeWidthExact | RCTSurfaceSizeMeasureModeHeightExact:
  41. default:
  42. return RCTRootViewSizeFlexibilityNone;
  43. }
  44. }
  45. @implementation RCTSurfaceHostingProxyRootView
  46. - (instancetype)initWithBridge:(RCTBridge *)bridge
  47. moduleName:(NSString *)moduleName
  48. initialProperties:(NSDictionary *)initialProperties
  49. {
  50. RCTAssertMainQueue();
  51. RCTAssert(bridge, @"A bridge instance is required to create an RCTSurfaceHostingProxyRootView");
  52. RCTAssert(moduleName, @"A moduleName is required to create an RCTSurfaceHostingProxyRootView");
  53. RCT_PROFILE_BEGIN_EVENT(RCTProfileTagAlways, @"-[RCTSurfaceHostingProxyRootView init]", nil);
  54. _bridge = bridge;
  55. if (!bridge.isLoading) {
  56. [bridge.performanceLogger markStartForTag:RCTPLTTI];
  57. }
  58. // `RCTRootViewSizeFlexibilityNone` is the RCTRootView's default.
  59. RCTSurfaceSizeMeasureMode sizeMeasureMode = convertToSurfaceSizeMeasureMode(RCTRootViewSizeFlexibilityNone);
  60. RCTSurface *surface = [[self class] createSurfaceWithBridge:bridge
  61. moduleName:moduleName
  62. initialProperties:initialProperties];
  63. [surface start];
  64. if (self = [super initWithSurface:surface sizeMeasureMode:sizeMeasureMode]) {
  65. self.backgroundColor = [UIColor whiteColor];
  66. }
  67. RCT_PROFILE_END_EVENT(RCTProfileTagAlways, @"");
  68. return self;
  69. }
  70. - (instancetype)initWithBundleURL:(NSURL *)bundleURL
  71. moduleName:(NSString *)moduleName
  72. initialProperties:(NSDictionary *)initialProperties
  73. launchOptions:(NSDictionary *)launchOptions
  74. {
  75. RCTBridge *bridge = [[RCTBridge alloc] initWithBundleURL:bundleURL moduleProvider:nil launchOptions:launchOptions];
  76. return [self initWithBridge:bridge moduleName:moduleName initialProperties:initialProperties];
  77. }
  78. RCT_NOT_IMPLEMENTED(-(instancetype)initWithFrame : (CGRect)frame)
  79. RCT_NOT_IMPLEMENTED(-(instancetype)initWithCoder : (NSCoder *)aDecoder)
  80. #pragma mark proxy methods to RCTSurfaceHostingView
  81. - (NSString *)moduleName
  82. {
  83. return super.surface.moduleName;
  84. }
  85. - (UIView *)contentView
  86. {
  87. return self;
  88. }
  89. - (NSNumber *)reactTag
  90. {
  91. return super.surface.rootViewTag;
  92. }
  93. - (RCTRootViewSizeFlexibility)sizeFlexibility
  94. {
  95. return convertToRootViewSizeFlexibility(super.sizeMeasureMode);
  96. }
  97. - (void)setSizeFlexibility:(RCTRootViewSizeFlexibility)sizeFlexibility
  98. {
  99. super.sizeMeasureMode = convertToSurfaceSizeMeasureMode(sizeFlexibility);
  100. }
  101. - (NSDictionary *)appProperties
  102. {
  103. return super.surface.properties;
  104. }
  105. - (void)setAppProperties:(NSDictionary *)appProperties
  106. {
  107. [super.surface setProperties:appProperties];
  108. }
  109. - (UIView *)loadingView
  110. {
  111. return super.activityIndicatorViewFactory ? super.activityIndicatorViewFactory() : nil;
  112. }
  113. - (void)setLoadingView:(UIView *)loadingView
  114. {
  115. super.activityIndicatorViewFactory = ^UIView *(void)
  116. {
  117. return loadingView;
  118. };
  119. }
  120. #pragma mark RCTSurfaceDelegate proxying
  121. - (void)surface:(RCTSurface *)surface didChangeStage:(RCTSurfaceStage)stage
  122. {
  123. [super surface:surface didChangeStage:stage];
  124. if (RCTSurfaceStageIsRunning(stage)) {
  125. [_bridge.performanceLogger markStopForTag:RCTPLTTI];
  126. dispatch_async(dispatch_get_main_queue(), ^{
  127. [[NSNotificationCenter defaultCenter] postNotificationName:RCTContentDidAppearNotification object:self];
  128. });
  129. }
  130. }
  131. - (void)surface:(RCTSurface *)surface didChangeIntrinsicSize:(CGSize)intrinsicSize
  132. {
  133. [super surface:surface didChangeIntrinsicSize:intrinsicSize];
  134. [_delegate rootViewDidChangeIntrinsicSize:(RCTRootView *)self];
  135. }
  136. #pragma mark legacy
  137. - (UIViewController *)reactViewController
  138. {
  139. return _reactViewController ?: [super reactViewController];
  140. }
  141. #pragma mark unsupported
  142. - (void)cancelTouches
  143. {
  144. // Not supported.
  145. }
  146. @end