mirror of
https://github.com/status-im/react-native.git
synced 2025-01-15 03:56:03 +00:00
Better support of UIKit layout stuff for RCTRootView an co.
Summary: Now RCTRootView is much more reliable citizen of UIKit, it got: * Implemented `sizeThatFits:`; * Implemented `instrinsicContentSize`; * Notifying superview via `setNeedsLayout` about changed size. All it make possible painless integration of ReactNative-powered widgets inside existing native apps. Reviewed By: javache Differential Revision: D4577890 fbshipit-source-id: 9897cb002c9d658a97fd436240c2ac947ba2084b
This commit is contained in:
parent
b6ca952eeb
commit
9dccff0eda
@ -46,7 +46,6 @@ NSString *const RCTContentDidAppearNotification = @"RCTContentDidAppearNotificat
|
|||||||
NSString *_moduleName;
|
NSString *_moduleName;
|
||||||
NSDictionary *_launchOptions;
|
NSDictionary *_launchOptions;
|
||||||
RCTRootContentView *_contentView;
|
RCTRootContentView *_contentView;
|
||||||
|
|
||||||
BOOL _passThroughTouches;
|
BOOL _passThroughTouches;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -60,8 +59,7 @@ NSString *const RCTContentDidAppearNotification = @"RCTContentDidAppearNotificat
|
|||||||
|
|
||||||
RCT_PROFILE_BEGIN_EVENT(RCTProfileTagAlways, @"-[RCTRootView init]", nil);
|
RCT_PROFILE_BEGIN_EVENT(RCTProfileTagAlways, @"-[RCTRootView init]", nil);
|
||||||
|
|
||||||
if ((self = [super initWithFrame:CGRectZero])) {
|
if (self = [super initWithFrame:CGRectZero]) {
|
||||||
|
|
||||||
self.backgroundColor = [UIColor whiteColor];
|
self.backgroundColor = [UIColor whiteColor];
|
||||||
|
|
||||||
_bridge = bridge;
|
_bridge = bridge;
|
||||||
@ -95,7 +93,7 @@ NSString *const RCTContentDidAppearNotification = @"RCTContentDidAppearNotificat
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (!_bridge.loading) {
|
if (!_bridge.loading) {
|
||||||
[self bundleFinishedLoading:[_bridge batchedBridge]];
|
[self bundleFinishedLoading:([_bridge batchedBridge] ?: _bridge)];
|
||||||
}
|
}
|
||||||
|
|
||||||
[self showLoadingView];
|
[self showLoadingView];
|
||||||
@ -137,6 +135,8 @@ RCT_NOT_IMPLEMENTED(- (instancetype)initWithCoder:(NSCoder *)aDecoder)
|
|||||||
_contentView.backgroundColor = backgroundColor;
|
_contentView.backgroundColor = backgroundColor;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#pragma mark - passThroughTouches
|
||||||
|
|
||||||
- (BOOL)passThroughTouches
|
- (BOOL)passThroughTouches
|
||||||
{
|
{
|
||||||
return _contentView.passThroughTouches;
|
return _contentView.passThroughTouches;
|
||||||
@ -148,6 +148,26 @@ RCT_NOT_IMPLEMENTED(- (instancetype)initWithCoder:(NSCoder *)aDecoder)
|
|||||||
_contentView.passThroughTouches = passThroughTouches;
|
_contentView.passThroughTouches = passThroughTouches;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#pragma mark - Layout
|
||||||
|
|
||||||
|
- (CGSize)sizeThatFits:(CGSize)size
|
||||||
|
{
|
||||||
|
return CGSizeMake(
|
||||||
|
_sizeFlexibility & RCTRootViewSizeFlexibilityWidth ? MIN(_intrinsicSize.width, size.width) : size.width,
|
||||||
|
_sizeFlexibility & RCTRootViewSizeFlexibilityHeight ? MIN(_intrinsicSize.height, size.height) : size.height
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)layoutSubviews
|
||||||
|
{
|
||||||
|
[super layoutSubviews];
|
||||||
|
_contentView.frame = self.bounds;
|
||||||
|
_loadingView.center = (CGPoint){
|
||||||
|
CGRectGetMidX(self.bounds),
|
||||||
|
CGRectGetMidY(self.bounds)
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
- (UIViewController *)reactViewController
|
- (UIViewController *)reactViewController
|
||||||
{
|
{
|
||||||
return _reactViewController ?: [super reactViewController];
|
return _reactViewController ?: [super reactViewController];
|
||||||
@ -278,16 +298,6 @@ RCT_NOT_IMPLEMENTED(- (instancetype)initWithCoder:(NSCoder *)aDecoder)
|
|||||||
_contentView.sizeFlexibility = _sizeFlexibility;
|
_contentView.sizeFlexibility = _sizeFlexibility;
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)layoutSubviews
|
|
||||||
{
|
|
||||||
[super layoutSubviews];
|
|
||||||
_contentView.frame = self.bounds;
|
|
||||||
_loadingView.center = (CGPoint){
|
|
||||||
CGRectGetMidX(self.bounds),
|
|
||||||
CGRectGetMidY(self.bounds)
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
|
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
|
||||||
{
|
{
|
||||||
// The root view itself should never receive touches
|
// The root view itself should never receive touches
|
||||||
@ -323,6 +333,9 @@ RCT_NOT_IMPLEMENTED(- (instancetype)initWithCoder:(NSCoder *)aDecoder)
|
|||||||
|
|
||||||
_intrinsicSize = intrinsicSize;
|
_intrinsicSize = intrinsicSize;
|
||||||
|
|
||||||
|
[self invalidateIntrinsicContentSize];
|
||||||
|
[self.superview setNeedsLayout];
|
||||||
|
|
||||||
// Don't notify the delegate if the content remains invisible or its size has not changed
|
// Don't notify the delegate if the content remains invisible or its size has not changed
|
||||||
if (bothSizesHaveAZeroDimension || sizesAreEqual) {
|
if (bothSizesHaveAZeroDimension || sizesAreEqual) {
|
||||||
return;
|
return;
|
||||||
@ -331,6 +344,11 @@ RCT_NOT_IMPLEMENTED(- (instancetype)initWithCoder:(NSCoder *)aDecoder)
|
|||||||
[_delegate rootViewDidChangeIntrinsicSize:self];
|
[_delegate rootViewDidChangeIntrinsicSize:self];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
- (CGSize)intrinsicContentSize
|
||||||
|
{
|
||||||
|
return _intrinsicSize;
|
||||||
|
}
|
||||||
|
|
||||||
- (void)contentViewInvalidated
|
- (void)contentViewInvalidated
|
||||||
{
|
{
|
||||||
[_contentView removeFromSuperview];
|
[_contentView removeFromSuperview];
|
||||||
|
Loading…
x
Reference in New Issue
Block a user