This repository has been archived on 2022-03-12. You can view files and clone it, but cannot push or open issues or pull requests.

66 lines
1.4 KiB
Mathematica
Raw Normal View History

2021-04-02 02:24:13 +03:00
#import "RNCSafeAreaProvider.h"
#import <React/RCTBridge.h>
#import <React/RCTUIManager.h>
#import "RCTView+SafeAreaCompat.h"
@implementation RNCSafeAreaProvider
{
UIEdgeInsets _currentSafeAreaInsets;
CGRect _currentFrame;
BOOL _initialInsetsSent;
}
- (void)safeAreaInsetsDidChange
{
[self invalidateSafeAreaInsets];
}
- (void)invalidateSafeAreaInsets
{
// This gets called before the view size is set by react-native so
// make sure to wait so we don't set wrong insets to JS.
if (CGSizeEqualToSize(self.frame.size, CGSizeZero)) {
return;
}
UIEdgeInsets safeAreaInsets = [self safeAreaInsetsOrEmulate];
CGRect frame = [self convertRect:self.bounds toView:nil];
if (
_initialInsetsSent &&
UIEdgeInsetsEqualToEdgeInsetsWithThreshold(safeAreaInsets, _currentSafeAreaInsets, 1.0 / RCTScreenScale()) &&
CGRectEqualToRect(frame, _currentFrame)
) {
return;
}
_initialInsetsSent = YES;
_currentSafeAreaInsets = safeAreaInsets;
_currentFrame = frame;
self.onInsetsChange(@{
@"insets": @{
@"top": @(safeAreaInsets.top),
@"right": @(safeAreaInsets.right),
@"bottom": @(safeAreaInsets.bottom),
@"left": @(safeAreaInsets.left),
},
@"frame": @{
@"x": @(frame.origin.x),
@"y": @(frame.origin.y),
@"width": @(frame.size.width),
@"height": @(frame.size.height),
},
});
}
- (void)layoutSubviews
{
[super layoutSubviews];
[self invalidateSafeAreaInsets];
}
@end