From e93451d8e45d4b5a3c20f9408f9115e95eee0be6 Mon Sep 17 00:00:00 2001 From: Dimitris - Rafail Katsampas Date: Sat, 22 Feb 2025 00:52:03 +0200 Subject: [PATCH 1/2] fix(ios): Added layoutChanged event support to Page --- packages/core/ui/core/view/index.d.ts | 4 ++ packages/core/ui/core/view/index.ios.ts | 58 +++++++++++++---------- packages/core/ui/core/view/view-common.ts | 4 ++ packages/core/ui/page/index.ios.ts | 6 +-- 4 files changed, 42 insertions(+), 30 deletions(-) diff --git a/packages/core/ui/core/view/index.d.ts b/packages/core/ui/core/view/index.d.ts index 568c1941db..7186aaeb6b 100644 --- a/packages/core/ui/core/view/index.d.ts +++ b/packages/core/ui/core/view/index.d.ts @@ -1034,6 +1034,10 @@ export abstract class View extends ViewCommon { * @private */ _goToVisualState(state: string); + /** + * @private + */ + _modifyNativeViewFrame(nativeView: any, frame: any): void; /** * @private */ diff --git a/packages/core/ui/core/view/index.ios.ts b/packages/core/ui/core/view/index.ios.ts index 854b3836bd..a944cbdfbc 100644 --- a/packages/core/ui/core/view/index.ios.ts +++ b/packages/core/ui/core/view/index.ios.ts @@ -202,38 +202,46 @@ export class View extends ViewCommon implements ViewDefinition { // } + public _modifyNativeViewFrame(nativeView: UIView, frame: CGRect): void { + let transform: CATransform3D; + + if (this._isTransformed) { + // Always set identity transform before setting frame + transform = nativeView.layer.transform; + nativeView.layer.transform = CATransform3DIdentity; + } else { + transform = null; + } + + nativeView.frame = frame; + + const adjustedFrame = this.applySafeAreaInsets(frame); + if (adjustedFrame) { + nativeView.frame = adjustedFrame; + } + + if (transform != null) { + // Re-apply the transform after the frame is adjusted + nativeView.layer.transform = transform; + } + + const boundsOrigin = nativeView.bounds.origin; + const boundsFrame = adjustedFrame || frame; + + nativeView.bounds = CGRectMake(boundsOrigin.x, boundsOrigin.y, boundsFrame.size.width, boundsFrame.size.height); + nativeView.layoutIfNeeded(); + } + public _setNativeViewFrame(nativeView: UIView, frame: CGRect): void { const oldFrame = this._cachedFrame || nativeView.frame; + if (!CGRectEqualToRect(oldFrame, frame)) { if (Trace.isEnabled()) { Trace.write(this + ' :_setNativeViewFrame: ' + JSON.stringify(IOSHelper.getPositionFromFrame(frame)), Trace.categories.Layout); } - this._cachedFrame = frame; - let adjustedFrame = null; - let transform = null; - if (this._isTransformed) { - // Always set identity transform before setting frame; - transform = nativeView.layer.transform; - nativeView.layer.transform = CATransform3DIdentity; - nativeView.frame = frame; - } else { - nativeView.frame = frame; - } - adjustedFrame = this.applySafeAreaInsets(frame); - if (adjustedFrame) { - nativeView.frame = adjustedFrame; - } - - if (this._isTransformed) { - // re-apply the transform after the frame is adjusted - nativeView.layer.transform = transform; - } - - 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._cachedFrame = frame; + this._modifyNativeViewFrame(nativeView, frame); this._raiseLayoutChangedEvent(); this._isLaidOut = true; diff --git a/packages/core/ui/core/view/view-common.ts b/packages/core/ui/core/view/view-common.ts index 65ab18f466..3610fa1965 100644 --- a/packages/core/ui/core/view/view-common.ts +++ b/packages/core/ui/core/view/view-common.ts @@ -1176,6 +1176,10 @@ export abstract class ViewCommon extends ViewBase implements ViewDefinition { super.resetNativeView(); } + public _modifyNativeViewFrame(nativeView: any, frame: any) { + // + } + public _setNativeViewFrame(nativeView: any, frame: any) { // } diff --git a/packages/core/ui/page/index.ios.ts b/packages/core/ui/page/index.ios.ts index 8313c5c18a..e5397c905c 100644 --- a/packages/core/ui/page/index.ios.ts +++ b/packages/core/ui/page/index.ios.ts @@ -423,11 +423,7 @@ export class Page extends PageBase { return this._ios; } - public layoutNativeView(left: number, top: number, right: number, bottom: number): void { - // - } - - public _setNativeViewFrame(nativeView: UIView, frame: CGRect) { + public _modifyNativeViewFrame(nativeView: UIView, frame: CGRect) { // } From 1dc73a7795c17430e22319892eab321d6af38564 Mon Sep 17 00:00:00 2001 From: Dimitris - Rafail Katsampas Date: Sat, 22 Feb 2025 01:19:13 +0200 Subject: [PATCH 2/2] fix: Corrected native view frame equality check --- packages/core/ui/core/view/index.ios.ts | 2 ++ packages/core/ui/page/index.ios.ts | 13 +++++++++++++ 2 files changed, 15 insertions(+) diff --git a/packages/core/ui/core/view/index.ios.ts b/packages/core/ui/core/view/index.ios.ts index a944cbdfbc..39d3d2f485 100644 --- a/packages/core/ui/core/view/index.ios.ts +++ b/packages/core/ui/core/view/index.ios.ts @@ -246,6 +246,8 @@ export class View extends ViewCommon implements ViewDefinition { this._raiseLayoutChangedEvent(); this._isLaidOut = true; } else if (!this._isLaidOut) { + this._cachedFrame = frame; + // Rects could be equal on the first layout and an event should be raised. this._raiseLayoutChangedEvent(); // But make sure event is raised only once if rects are equal on the first layout as diff --git a/packages/core/ui/page/index.ios.ts b/packages/core/ui/page/index.ios.ts index e5397c905c..a36bce5fb7 100644 --- a/packages/core/ui/page/index.ios.ts +++ b/packages/core/ui/page/index.ios.ts @@ -423,6 +423,19 @@ export class Page extends PageBase { return this._ios; } + public layoutNativeView(left: number, top: number, right: number, bottom: number): void { + const nativeView = this.nativeViewProtected; + if (!nativeView) { + return; + } + + const currentFrame = nativeView.frame; + // Create a copy of current view frame + const newFrame = CGRectMake(currentFrame.origin.x, currentFrame.origin.y, currentFrame.size.width, currentFrame.size.height); + + this._setNativeViewFrame(nativeView, newFrame); + } + public _modifyNativeViewFrame(nativeView: UIView, frame: CGRect) { // }