diff --git a/apps/automated/src/test-runner.ts b/apps/automated/src/test-runner.ts index dcc9fbde7..2283b1898 100644 --- a/apps/automated/src/test-runner.ts +++ b/apps/automated/src/test-runner.ts @@ -138,19 +138,19 @@ allTests['STACKLAYOUT'] = stackLayoutTests; import * as flexBoxLayoutTests from './ui/layouts/flexbox-layout-tests'; allTests['FLEXBOXLAYOUT'] = flexBoxLayoutTests; -// import * as safeAreaLayoutTests from './ui/layouts/safe-area-tests'; -// import * as safeAreaListViewtTests from './ui/list-view/list-view-safe-area-tests'; -// import * as scrollViewSafeAreaTests from './ui/scroll-view/scroll-view-safe-area-tests'; -// import * as repeaterSafeAreaTests from './ui/repeater/repeater-safe-area-tests'; -// import * as webViewSafeAreaTests from './ui/web-view/web-view-safe-area-tests'; +import * as safeAreaLayoutTests from './ui/layouts/safe-area-tests'; +import * as safeAreaListViewtTests from './ui/list-view/list-view-safe-area-tests'; +import * as scrollViewSafeAreaTests from './ui/scroll-view/scroll-view-safe-area-tests'; +import * as repeaterSafeAreaTests from './ui/repeater/repeater-safe-area-tests'; +import * as webViewSafeAreaTests from './ui/web-view/web-view-safe-area-tests'; -// if (isIOS && Utils.ios.MajorVersion > 10) { -// allTests['SAFEAREALAYOUT'] = safeAreaLayoutTests; -// allTests['SAFEAREA-LISTVIEW'] = safeAreaListViewtTests; -// allTests['SAFEAREA-SCROLL-VIEW'] = scrollViewSafeAreaTests; -// allTests['SAFEAREA-REPEATER'] = repeaterSafeAreaTests; -// allTests['SAFEAREA-WEBVIEW'] = webViewSafeAreaTests; -// } +if (isIOS && Utils.ios.MajorVersion > 10) { + allTests['SAFEAREALAYOUT'] = safeAreaLayoutTests; + allTests['SAFEAREA-LISTVIEW'] = safeAreaListViewtTests; + allTests['SAFEAREA-SCROLL-VIEW'] = scrollViewSafeAreaTests; + allTests['SAFEAREA-REPEATER'] = repeaterSafeAreaTests; + allTests['SAFEAREA-WEBVIEW'] = webViewSafeAreaTests; +} import * as rootViewsCssClassesTests from './ui/styling/root-views-css-classes-tests'; allTests['ROOT-VIEWS-CSS-CLASSES'] = rootViewsCssClassesTests; @@ -278,8 +278,8 @@ allTests['TAB-VIEW-ROOT'] = tabViewRootTests; import * as resetRootViewTests from './ui/root-view/reset-root-view-tests'; allTests['RESET-ROOT-VIEW'] = resetRootViewTests; -// import * as rootViewTests from './ui/root-view/root-view-tests'; -// allTests['ROOT-VIEW'] = rootViewTests; +import * as rootViewTests from './ui/root-view/root-view-tests'; +allTests['ROOT-VIEW'] = rootViewTests; import * as utilsTests from './utils/utils-tests'; allTests['UTILS'] = utilsTests; diff --git a/packages/core/ui/core/view/index.ios.ts b/packages/core/ui/core/view/index.ios.ts index dd6c71fcf..11bdba0fc 100644 --- a/packages/core/ui/core/view/index.ios.ts +++ b/packages/core/ui/core/view/index.ios.ts @@ -211,6 +211,7 @@ export class View extends ViewCommon implements ViewDefinition { const boundsOrigin = nativeView.bounds.origin; const boundsFrame = adjustedFrame || frame; nativeView.bounds = CGRectMake(boundsOrigin.x, boundsOrigin.y, boundsFrame.size.width, boundsFrame.size.height); + nativeView.layoutIfNeeded(); this._raiseLayoutChangedEvent(); this._isLaidOut = true; @@ -888,9 +889,6 @@ export class View extends ViewCommon implements ViewDefinition { } _setNativeClipToBounds() { - if (!this.nativeViewProtected) { - return; - } const backgroundInternal = this.style.backgroundInternal; this.nativeViewProtected.clipsToBounds = (this.nativeViewProtected instanceof UIScrollView || backgroundInternal.hasBorderWidth() || backgroundInternal.hasBorderRadius()) && !backgroundInternal.hasBoxShadow(); } diff --git a/packages/core/ui/core/view/view-helper/index.ios.ts b/packages/core/ui/core/view/view-helper/index.ios.ts index 773c6e66b..5b8022d39 100644 --- a/packages/core/ui/core/view/view-helper/index.ios.ts +++ b/packages/core/ui/core/view/view-helper/index.ios.ts @@ -14,51 +14,9 @@ const majorVersion = iOSNativeHelper.MajorVersion; class UILayoutViewController extends UIViewController { public owner: WeakRef; - private _isRunningLayout: number; - private get isRunningLayout() { - return this._isRunningLayout !== 0; - } - private startRunningLayout() { - this._isRunningLayout++; - } - private finishRunningLayout() { - this._isRunningLayout--; - this.clearScheduledLayout(); - } - private runLayout(cb: () => void) { - try { - this.startRunningLayout(); - cb(); - } finally { - this.finishRunningLayout(); - } - } - - layoutTimer: number; - - private clearScheduledLayout() { - if (this.layoutTimer) { - clearTimeout(this.layoutTimer); - this.layoutTimer = null; - } - } - - private scheduleLayout() { - if (this.layoutTimer) { - return; - } - setTimeout(() => { - this.layoutTimer = null; - if (!this.isRunningLayout) { - this.runLayout(() => this.layoutOwner()); - } - }); - } - public static initWithOwner(owner: WeakRef): UILayoutViewController { const controller = UILayoutViewController.new(); controller.owner = owner; - controller._isRunningLayout = 0; return controller; } @@ -71,11 +29,6 @@ class UILayoutViewController extends UIViewController { this.extendedLayoutIncludesOpaqueBars = true; } - public viewSafeAreaInsetsDidChange(): void { - super.viewSafeAreaInsetsDidChange(); - this.scheduleLayout(); - } - public viewWillLayoutSubviews(): void { super.viewWillLayoutSubviews(); const owner = this.owner?.deref(); @@ -85,20 +38,8 @@ class UILayoutViewController extends UIViewController { } public viewDidLayoutSubviews(): void { - this.startRunningLayout(); super.viewDidLayoutSubviews(); - this.layoutOwner(); - this.finishRunningLayout(); - } - layoutOwner(force = false) { const owner = this.owner?.deref(); - if (!force && !!owner.nativeViewProtected?.layer.needsLayout?.()) { - // we skip layout if the view is not yet laid out yet - // this usually means that viewDidLayoutSubviews will be called again - // so doing a layout pass now will layout with the wrong parameters - return; - } - if (owner) { if (majorVersion >= 11) { // Handle nested UILayoutViewController safe area application. diff --git a/packages/core/ui/page/index.ios.ts b/packages/core/ui/page/index.ios.ts index 6f61bcc8c..bd2bbab0e 100644 --- a/packages/core/ui/page/index.ios.ts +++ b/packages/core/ui/page/index.ios.ts @@ -74,6 +74,7 @@ class UIViewControllerImpl extends UIViewController { public isBackstackSkipped: boolean; public isBackstackCleared: boolean; + private didFirstLayout: boolean; // this is initialized in initWithOwner since the constructor doesn't run on native classes private _isRunningLayout: number; private get isRunningLayout() { @@ -84,7 +85,7 @@ class UIViewControllerImpl extends UIViewController { } private finishRunningLayout() { this._isRunningLayout--; - this.clearScheduledLayout(); + this.didFirstLayout = true; } private runLayout(cb: () => void) { try { @@ -95,31 +96,11 @@ class UIViewControllerImpl extends UIViewController { } } - layoutTimer: number; - - private clearScheduledLayout() { - if (this.layoutTimer) { - clearTimeout(this.layoutTimer); - this.layoutTimer = null; - } - } - - private scheduleLayout() { - if (this.layoutTimer) { - return; - } - setTimeout(() => { - this.layoutTimer = null; - if (!this.isRunningLayout) { - this.runLayout(() => this.layoutOwner()); - } - }); - } - public static initWithOwner(owner: WeakRef): UIViewControllerImpl { const controller = UIViewControllerImpl.new(); controller._owner = owner; controller._isRunningLayout = 0; + controller.didFirstLayout = false; return controller; } @@ -300,24 +281,19 @@ class UIViewControllerImpl extends UIViewController { public viewSafeAreaInsetsDidChange(): void { super.viewSafeAreaInsetsDidChange(); - this.scheduleLayout(); + if (this.isRunningLayout || !this.didFirstLayout) { + return; + } + const owner = this._owner?.deref(); + if (owner) { + this.runLayout(() => IOSHelper.layoutView(this, owner)); + } } public viewDidLayoutSubviews(): void { this.startRunningLayout(); super.viewDidLayoutSubviews(); - this.layoutOwner(); - this.finishRunningLayout(); - } - - layoutOwner(force = false) { const owner = this._owner?.deref(); - if (!force && !!owner.nativeViewProtected?.layer.needsLayout?.()) { - // we skip layout if the view is not yet laid out yet - // this usually means that viewDidLayoutSubviews will be called again - // so doing a layout pass now will layout with the wrong parameters - return; - } if (owner) { // layout(owner.actionBar) // layout(owner.content) @@ -369,6 +345,7 @@ class UIViewControllerImpl extends UIViewController { IOSHelper.layoutView(this, owner); } + this.finishRunningLayout(); } // Mind implementation for other controllerss