/** * Copyright (c) 2015-present, Facebook, Inc. * All rights reserved. * * This source code is licensed under the BSD-style license found in the * LICENSE file in the root directory of this source tree. An additional grant * of patent rights can be found in the PATENTS file in the same directory. */ #import "RCTSurfaceRootShadowView.h" #import "RCTI18nUtil.h" #import "RCTShadowView+Layout.h" #import "RCTUIManagerUtils.h" @implementation RCTSurfaceRootShadowView { CGSize _intrinsicSize; BOOL _isRendered; BOOL _isLaidOut; } - (instancetype)init { if (self = [super init]) { self.viewName = @"RCTSurfaceRootView"; _baseDirection = [[RCTI18nUtil sharedInstance] isRTL] ? YGDirectionRTL : YGDirectionLTR; _minimumSize = CGSizeZero; _maximumSize = CGSizeMake(CGFLOAT_MAX, CGFLOAT_MAX); self.alignSelf = YGAlignStretch; self.flex = 1; } return self; } - (void)insertReactSubview:(RCTShadowView *)subview atIndex:(NSInteger)atIndex { [super insertReactSubview:subview atIndex:atIndex]; if (!_isRendered) { [_delegate rootShadowViewDidStartRendering:self]; _isRendered = YES; } } - (void)layoutWithAffectedShadowViews:(NSHashTable *)affectedShadowViews { NSHashTable *other = [NSHashTable new]; RCTLayoutContext layoutContext = {}; layoutContext.absolutePosition = CGPointZero; layoutContext.affectedShadowViews = affectedShadowViews; layoutContext.other = other; [self layoutWithMinimumSize:_minimumSize maximumSize:_maximumSize layoutDirection:RCTUIKitLayoutDirectionFromYogaLayoutDirection(_baseDirection) layoutContext:layoutContext]; self.intrinsicSize = self.layoutMetrics.frame.size; if (_isRendered && !_isLaidOut) { [_delegate rootShadowViewDidStartLayingOut:self]; _isLaidOut = YES; } } - (void)setMinimumSize:(CGSize)minimumSize maximumSize:(CGSize)maximumSize { if (CGSizeEqualToSize(minimumSize, _minimumSize) && CGSizeEqualToSize(maximumSize, _maximumSize)) { return; } _maximumSize = maximumSize; _minimumSize = minimumSize; } - (void)setIntrinsicSize:(CGSize)intrinsicSize { if (CGSizeEqualToSize(_intrinsicSize, intrinsicSize)) { return; } _intrinsicSize = intrinsicSize; [_delegate rootShadowView:self didChangeIntrinsicSize:intrinsicSize]; } - (CGSize)intrinsicSize { return _intrinsicSize; } @end