diff --git a/e2e/safe-area/app/scrollview/fragments/hscroll-grid-fragment.xml b/e2e/safe-area/app/scrollview/fragments/hscroll-grid-fragment.xml index 807013e48..38bf866bf 100644 --- a/e2e/safe-area/app/scrollview/fragments/hscroll-grid-fragment.xml +++ b/e2e/safe-area/app/scrollview/fragments/hscroll-grid-fragment.xml @@ -1,5 +1,5 @@ - + diff --git a/e2e/safe-area/app/scrollview/fragments/vscroll-grid-fragment.xml b/e2e/safe-area/app/scrollview/fragments/vscroll-grid-fragment.xml index 2aecefaec..7a891bbf2 100644 --- a/e2e/safe-area/app/scrollview/fragments/vscroll-grid-fragment.xml +++ b/e2e/safe-area/app/scrollview/fragments/vscroll-grid-fragment.xml @@ -1,5 +1,5 @@ - + diff --git a/tns-core-modules/ui/core/view/view.ios.ts b/tns-core-modules/ui/core/view/view.ios.ts index 820b8bfb9..d0da48a8f 100644 --- a/tns-core-modules/ui/core/view/view.ios.ts +++ b/tns-core-modules/ui/core/view/view.ios.ts @@ -776,9 +776,9 @@ export namespace ios { const inWindowRight = inWindowLeft + layout.round(layout.toDevicePixels(frame.size.width)); const inWindowBottom = inWindowTop + layout.round(layout.toDevicePixels(frame.size.height)); - const parentWithController = ios.getParentWithViewController(view); - const safeArea = parentWithController.viewController.view.safeAreaLayoutGuide.layoutFrame; - const fullscreen = parentWithController.viewController.view.frame; + const availableSpace = getAvailableSpaceFromParent(view); + const safeArea = availableSpace.safeArea; + const fullscreen = availableSpace.fullscreen; const position = ios.getPositionFromFrame(frame); const safeAreaPosition = ios.getPositionFromFrame(safeArea); @@ -830,6 +830,31 @@ export namespace ios { layoutParent(view.parent); } + function getAvailableSpaceFromParent(view: View): { safeArea: CGRect, fullscreen: CGRect } { + // Search for ViewController or UIScrollView parent to get their content size. + let parent = view.parent; + while (parent && !parent.viewController && !(parent.nativeViewProtected instanceof UIScrollView)) { + parent = parent.parent as View; + } + + let fullscreen = null; + let safeArea = null; + + if (parent.viewController) { + const nativeView = parent.viewController.view; + safeArea = nativeView.safeAreaLayoutGuide.layoutFrame; + fullscreen = nativeView.frame; + } + + if (parent.nativeViewProtected instanceof UIScrollView) { + const nativeView = parent.nativeViewProtected; + safeArea = nativeView.safeAreaLayoutGuide.layoutFrame; + fullscreen = CGRectMake(0, 0, nativeView.contentSize.width, nativeView.contentSize.height); + } + + return { safeArea: safeArea, fullscreen: fullscreen} + } + export class UILayoutViewController extends UIViewController { public owner: WeakRef; diff --git a/tns-core-modules/ui/scroll-view/scroll-view.ios.ts b/tns-core-modules/ui/scroll-view/scroll-view.ios.ts index f1345c7e2..c56a72e24 100644 --- a/tns-core-modules/ui/scroll-view/scroll-view.ios.ts +++ b/tns-core-modules/ui/scroll-view/scroll-view.ios.ts @@ -143,8 +143,9 @@ export class ScrollView extends ScrollViewBase { } public onLayout(left: number, top: number, right: number, bottom: number): void { - let width = (right - left); - let height = (bottom - top); + const insets = this.getSafeAreaInsets(); + let width = (right - left - insets.right - insets.left); + let height = (bottom - top - insets.bottom - insets.top); const nativeView = this.nativeViewProtected; @@ -155,16 +156,21 @@ export class ScrollView extends ScrollViewBase { nativeView.contentInsetAdjustmentBehavior = 2; } - const insets = this.getSafeAreaInsets(); + let scrollWidth = width; + let scrollHeight = height; if (this.orientation === "horizontal") { - width = Math.max(this._contentMeasuredWidth + insets.left + insets.right, width); + scrollWidth = Math.max(this._contentMeasuredWidth + insets.left + insets.right, width); + scrollHeight = height + insets.top + insets.bottom; + width = Math.max(this._contentMeasuredWidth, width); } else { - height = Math.max(this._contentMeasuredHeight + insets.top + insets.bottom, height); + scrollHeight = Math.max(this._contentMeasuredHeight + insets.top + insets.bottom, height); + scrollWidth = width + insets.left + insets.right; + height = Math.max(this._contentMeasuredHeight, height); } - nativeView.contentSize = CGSizeMake(layout.toDeviceIndependentPixels(width), layout.toDeviceIndependentPixels(height)); - View.layoutChild(this, this.layoutView, insets.left, insets.top, width, height); + nativeView.contentSize = CGSizeMake(layout.toDeviceIndependentPixels(scrollWidth), layout.toDeviceIndependentPixels(scrollHeight)); + View.layoutChild(this, this.layoutView, insets.left, insets.top, insets.left + width, insets.top + height); } public _onOrientationChanged() {