57 lines
1.7 KiB
Objective-C
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
|