123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247 |
- /*
- * 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 "RCTSurfaceHostingView.h"
- #import "RCTConstants.h"
- #import "RCTDefines.h"
- #import "RCTSurface.h"
- #import "RCTSurfaceDelegate.h"
- #import "RCTSurfaceView.h"
- #import "RCTUtils.h"
- @interface RCTSurfaceHostingView ()
- @property (nonatomic, assign) BOOL isActivityIndicatorViewVisible;
- @property (nonatomic, assign) BOOL isSurfaceViewVisible;
- @end
- @implementation RCTSurfaceHostingView {
- UIView *_Nullable _activityIndicatorView;
- UIView *_Nullable _surfaceView;
- RCTSurfaceStage _stage;
- }
- + (RCTSurface *)createSurfaceWithBridge:(RCTBridge *)bridge
- moduleName:(NSString *)moduleName
- initialProperties:(NSDictionary *)initialProperties
- {
- return [[RCTSurface alloc] initWithBridge:bridge moduleName:moduleName initialProperties:initialProperties];
- }
- RCT_NOT_IMPLEMENTED(-(instancetype)init)
- RCT_NOT_IMPLEMENTED(-(instancetype)initWithFrame : (CGRect)frame)
- RCT_NOT_IMPLEMENTED(-(nullable instancetype)initWithCoder : (NSCoder *)coder)
- - (instancetype)initWithBridge:(RCTBridge *)bridge
- moduleName:(NSString *)moduleName
- initialProperties:(NSDictionary *)initialProperties
- sizeMeasureMode:(RCTSurfaceSizeMeasureMode)sizeMeasureMode
- {
- RCTSurface *surface = [[self class] createSurfaceWithBridge:bridge
- moduleName:moduleName
- initialProperties:initialProperties];
- [surface start];
- return [self initWithSurface:surface sizeMeasureMode:sizeMeasureMode];
- }
- - (instancetype)initWithSurface:(RCTSurface *)surface sizeMeasureMode:(RCTSurfaceSizeMeasureMode)sizeMeasureMode
- {
- if (self = [super initWithFrame:CGRectZero]) {
- _surface = surface;
- _sizeMeasureMode = sizeMeasureMode;
- _surface.delegate = self;
- _stage = surface.stage;
- [self _updateViews];
- }
- return self;
- }
- - (void)dealloc
- {
- [_surface stop];
- }
- - (void)setFrame:(CGRect)frame
- {
- [super setFrame:frame];
- CGSize minimumSize;
- CGSize maximumSize;
- RCTSurfaceMinimumSizeAndMaximumSizeFromSizeAndSizeMeasureMode(
- self.bounds.size, _sizeMeasureMode, &minimumSize, &maximumSize);
- [_surface setMinimumSize:minimumSize maximumSize:maximumSize];
- }
- - (CGSize)intrinsicContentSize
- {
- if (RCTSurfaceStageIsPreparing(_stage)) {
- if (_activityIndicatorView) {
- return _activityIndicatorView.intrinsicContentSize;
- }
- return CGSizeZero;
- }
- return _surface.intrinsicSize;
- }
- - (CGSize)sizeThatFits:(CGSize)size
- {
- if (RCTSurfaceStageIsPreparing(_stage)) {
- if (_activityIndicatorView) {
- return [_activityIndicatorView sizeThatFits:size];
- }
- return CGSizeZero;
- }
- CGSize minimumSize;
- CGSize maximumSize;
- RCTSurfaceMinimumSizeAndMaximumSizeFromSizeAndSizeMeasureMode(size, _sizeMeasureMode, &minimumSize, &maximumSize);
- return [_surface sizeThatFitsMinimumSize:minimumSize maximumSize:maximumSize];
- }
- - (void)setStage:(RCTSurfaceStage)stage
- {
- if (stage == _stage) {
- return;
- }
- BOOL shouldInvalidateLayout = RCTSurfaceStageIsRunning(stage) != RCTSurfaceStageIsRunning(_stage) ||
- RCTSurfaceStageIsPreparing(stage) != RCTSurfaceStageIsPreparing(_stage);
- _stage = stage;
- if (shouldInvalidateLayout) {
- [self _invalidateLayout];
- [self _updateViews];
- }
- }
- - (void)setSizeMeasureMode:(RCTSurfaceSizeMeasureMode)sizeMeasureMode
- {
- if (sizeMeasureMode == _sizeMeasureMode) {
- return;
- }
- _sizeMeasureMode = sizeMeasureMode;
- [self _invalidateLayout];
- }
- #pragma mark - isActivityIndicatorViewVisible
- - (void)setIsActivityIndicatorViewVisible:(BOOL)visible
- {
- if (_isActivityIndicatorViewVisible == visible) {
- return;
- }
- _isActivityIndicatorViewVisible = visible;
- if (visible) {
- if (_activityIndicatorViewFactory) {
- _activityIndicatorView = _activityIndicatorViewFactory();
- _activityIndicatorView.frame = self.bounds;
- _activityIndicatorView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
- [self addSubview:_activityIndicatorView];
- }
- } else {
- [_activityIndicatorView removeFromSuperview];
- _activityIndicatorView = nil;
- }
- }
- #pragma mark - isSurfaceViewVisible
- - (void)setIsSurfaceViewVisible:(BOOL)visible
- {
- if (_isSurfaceViewVisible == visible) {
- return;
- }
- _isSurfaceViewVisible = visible;
- if (visible) {
- _surfaceView = _surface.view;
- _surfaceView.frame = self.bounds;
- _surfaceView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
- [self addSubview:_surfaceView];
- } else {
- [_surfaceView removeFromSuperview];
- _surfaceView = nil;
- }
- }
- #pragma mark - activityIndicatorViewFactory
- - (void)setActivityIndicatorViewFactory:(RCTSurfaceHostingViewActivityIndicatorViewFactory)activityIndicatorViewFactory
- {
- _activityIndicatorViewFactory = activityIndicatorViewFactory;
- if (_isActivityIndicatorViewVisible) {
- self.isActivityIndicatorViewVisible = NO;
- self.isActivityIndicatorViewVisible = YES;
- }
- }
- #pragma mark - UITraitCollection updates
- - (void)traitCollectionDidChange:(UITraitCollection *)previousTraitCollection
- {
- [super traitCollectionDidChange:previousTraitCollection];
- [[NSNotificationCenter defaultCenter]
- postNotificationName:RCTUserInterfaceStyleDidChangeNotification
- object:self
- userInfo:@{
- RCTUserInterfaceStyleDidChangeNotificationTraitCollectionKey : self.traitCollection,
- }];
- }
- #pragma mark - Private stuff
- - (void)_invalidateLayout
- {
- [self invalidateIntrinsicContentSize];
- [self.superview setNeedsLayout];
- }
- - (void)_updateViews
- {
- self.isSurfaceViewVisible = RCTSurfaceStageIsRunning(_stage);
- self.isActivityIndicatorViewVisible = RCTSurfaceStageIsPreparing(_stage);
- }
- - (void)didMoveToWindow
- {
- [super didMoveToWindow];
- [self _updateViews];
- }
- #pragma mark - RCTSurfaceDelegate
- - (void)surface:(__unused RCTSurface *)surface didChangeStage:(RCTSurfaceStage)stage
- {
- RCTExecuteOnMainQueue(^{
- [self setStage:stage];
- });
- }
- - (void)surface:(__unused RCTSurface *)surface didChangeIntrinsicSize:(__unused CGSize)intrinsicSize
- {
- RCTExecuteOnMainQueue(^{
- [self _invalidateLayout];
- });
- }
- @end
|