123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107 |
- /*
- * 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 "RCTRootContentView.h"
- #import "RCTBridge.h"
- #import "RCTPerformanceLogger.h"
- #import "RCTRootView.h"
- #import "RCTRootViewInternal.h"
- #import "RCTTouchHandler.h"
- #import "RCTUIManager.h"
- #import "UIView+React.h"
- @implementation RCTRootContentView
- - (instancetype)initWithFrame:(CGRect)frame
- bridge:(RCTBridge *)bridge
- reactTag:(NSNumber *)reactTag
- sizeFlexiblity:(RCTRootViewSizeFlexibility)sizeFlexibility
- {
- if ((self = [super initWithFrame:frame])) {
- _bridge = bridge;
- self.reactTag = reactTag;
- _sizeFlexibility = sizeFlexibility;
- _touchHandler = [[RCTTouchHandler alloc] initWithBridge:_bridge];
- [_touchHandler attachToView:self];
- [_bridge.uiManager registerRootView:self];
- }
- return self;
- }
- RCT_NOT_IMPLEMENTED(-(instancetype)initWithFrame : (CGRect)frame)
- RCT_NOT_IMPLEMENTED(-(instancetype)initWithCoder : (nonnull NSCoder *)aDecoder)
- - (void)layoutSubviews
- {
- [super layoutSubviews];
- [self updateAvailableSize];
- }
- - (void)insertReactSubview:(UIView *)subview atIndex:(NSInteger)atIndex
- {
- [super insertReactSubview:subview atIndex:atIndex];
- [_bridge.performanceLogger markStopForTag:RCTPLTTI];
- dispatch_async(dispatch_get_main_queue(), ^{
- if (!self->_contentHasAppeared) {
- self->_contentHasAppeared = YES;
- [[NSNotificationCenter defaultCenter] postNotificationName:RCTContentDidAppearNotification object:self.superview];
- }
- });
- }
- - (void)setSizeFlexibility:(RCTRootViewSizeFlexibility)sizeFlexibility
- {
- if (_sizeFlexibility == sizeFlexibility) {
- return;
- }
- _sizeFlexibility = sizeFlexibility;
- [self setNeedsLayout];
- }
- - (CGSize)availableSize
- {
- CGSize size = self.bounds.size;
- return CGSizeMake(
- _sizeFlexibility & RCTRootViewSizeFlexibilityWidth ? INFINITY : size.width,
- _sizeFlexibility & RCTRootViewSizeFlexibilityHeight ? INFINITY : size.height);
- }
- - (void)updateAvailableSize
- {
- if (!self.reactTag || !_bridge.isValid) {
- return;
- }
- [_bridge.uiManager setAvailableSize:self.availableSize forRootView:self];
- }
- - (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
- {
- // The root content view itself should never receive touches
- UIView *hitView = [super hitTest:point withEvent:event];
- if (_passThroughTouches && hitView == self) {
- return nil;
- }
- return hitView;
- }
- - (void)invalidate
- {
- if (self.userInteractionEnabled) {
- self.userInteractionEnabled = NO;
- [(RCTRootView *)self.superview contentViewInvalidated];
- [_bridge enqueueJSCall:@"AppRegistry"
- method:@"unmountApplicationComponentAtRootTag"
- args:@[ self.reactTag ]
- completion:NULL];
- }
- }
- @end
|