feat: iosIgnoreSafeArea property (#9092)

* feat: ios added ignoreSafeArea property

* fix: ensure it works when no viewControllerView
This commit is contained in:
Martin Guillon
2020-12-28 13:39:55 +01:00
committed by GitHub
parent 9391b44996
commit ea67422fcf
3 changed files with 20 additions and 5 deletions

View File

@@ -262,7 +262,9 @@ export class View extends ViewCommon implements ViewDefinition {
if (majorVersion <= 10) {
return null;
}
if (this.iosIgnoreSafeArea) {
return frame;
}
if (!this.iosOverflowSafeArea || !this.iosOverflowSafeAreaEnabled) {
return IOSHelper.shrinkToSafeArea(this, frame);
} else if (this.nativeViewProtected && this.nativeViewProtected.window) {
@@ -275,7 +277,9 @@ export class View extends ViewCommon implements ViewDefinition {
public getSafeAreaInsets(): { left; top; right; bottom } {
const safeAreaInsets = this.nativeViewProtected && this.nativeViewProtected.safeAreaInsets;
const insets = { left: 0, top: 0, right: 0, bottom: 0 };
if (this.iosIgnoreSafeArea) {
return insets;
}
if (safeAreaInsets) {
insets.left = layout.round(layout.toDevicePixels(safeAreaInsets.left));
insets.top = layout.round(layout.toDevicePixels(safeAreaInsets.top));

View File

@@ -758,7 +758,8 @@ export abstract class ViewCommon extends ViewBase implements ViewDefinition {
public isUserInteractionEnabled: boolean;
public iosOverflowSafeArea: boolean;
public iosOverflowSafeAreaEnabled: boolean;
public iosIgnoreSafeArea: boolean;
get isLayoutValid(): boolean {
return this._isLayoutValid;
}
@@ -1055,3 +1056,9 @@ export const iosOverflowSafeAreaEnabledProperty = new InheritedProperty<ViewComm
valueConverter: booleanConverter,
});
iosOverflowSafeAreaEnabledProperty.register(ViewCommon);
export const iosIgnoreSafeAreaProperty = new InheritedProperty({
name: 'iosIgnoreSafeArea',
defaultValue: false,
valueConverter: booleanConverter,
});
iosIgnoreSafeAreaProperty.register(ViewCommon);

View File

@@ -338,19 +338,23 @@ export class IOSHelper {
let fullscreen = null;
let safeArea = null;
let controllerInWindow = {x: 0, y: 0};
if (viewControllerView) {
safeArea = viewControllerView.safeAreaLayoutGuide.layoutFrame;
fullscreen = viewControllerView.frame;
controllerInWindow = viewControllerView.convertPointToView(viewControllerView.bounds.origin, null);
} else if (scrollView) {
const insets = scrollView.safeAreaInsets;
safeArea = CGRectMake(insets.left, insets.top, scrollView.contentSize.width - insets.left - insets.right, scrollView.contentSize.height - insets.top - insets.bottom);
fullscreen = CGRectMake(0, 0, scrollView.contentSize.width, scrollView.contentSize.height);
}
// We take into account the controller position inside the window.
// for example with a bottomsheet the controller will be "offset"
const locationInWindow = view.getLocationInWindow();
let inWindowLeft = locationInWindow.x;
let inWindowTop = locationInWindow.y;
let inWindowLeft = locationInWindow.x - controllerInWindow.x;
let inWindowTop = locationInWindow.y - controllerInWindow.y;
if (scrollView) {
inWindowLeft += scrollView.contentOffset.x;