GT2/Ejectable/node_modules/react-native-safe-area-context/ios/SafeAreaView/RCTView+SafeAreaCompat.m
2021-08-16 00:14:59 +00:00

57 lines
1.7 KiB
Objective-C

#import "RCTView+SafeAreaCompat.h"
#import <React/RCTUIManager.h>
BOOL UIEdgeInsetsEqualToEdgeInsetsWithThreshold(UIEdgeInsets insets1, UIEdgeInsets insets2, CGFloat threshold)
{
return ABS(insets1.left - insets2.left) <= threshold &&
ABS(insets1.right - insets2.right) <= threshold &&
ABS(insets1.top - insets2.top) <= threshold &&
ABS(insets1.bottom - insets2.bottom) <= threshold;
}
@implementation UIView(SafeAreaCompat)
- (BOOL)nativeSafeAreaSupport
{
return [self respondsToSelector:@selector(safeAreaInsets)];
}
- (UIEdgeInsets)safeAreaInsetsOrEmulate
{
#if defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && __IPHONE_OS_VERSION_MAX_ALLOWED >= 110000 /* __IPHONE_11_0 */
if (self.nativeSafeAreaSupport) {
if (@available(iOS 11.0, *)) {
return self.safeAreaInsets;
}
}
#endif
return self.emulatedSafeAreaInsets;
}
- (UIEdgeInsets)emulatedSafeAreaInsets
{
UIViewController* vc = self.reactViewController;
if (!vc) {
return UIEdgeInsetsZero;
}
CGFloat topLayoutOffset = vc.topLayoutGuide.length;
CGFloat bottomLayoutOffset = vc.bottomLayoutGuide.length;
CGRect safeArea = vc.view.bounds;
safeArea.origin.y += topLayoutOffset;
safeArea.size.height -= topLayoutOffset + bottomLayoutOffset;
CGRect localSafeArea = [vc.view convertRect:safeArea toView:self];
UIEdgeInsets safeAreaInsets = UIEdgeInsetsMake(0, 0, 0, 0);
if (CGRectGetMinY(localSafeArea) > CGRectGetMinY(self.bounds)) {
safeAreaInsets.top = CGRectGetMinY(localSafeArea) - CGRectGetMinY(self.bounds);
}
if (CGRectGetMaxY(localSafeArea) < CGRectGetMaxY(self.bounds)) {
safeAreaInsets.bottom = CGRectGetMaxY(self.bounds) - CGRectGetMaxY(localSafeArea);
}
return safeAreaInsets;
}
@end