From 755def3a12f7a3bf99ce809c5dd02735fba09e71 Mon Sep 17 00:00:00 2001 From: vakrilov Date: Wed, 25 Nov 2015 16:06:24 +0200 Subject: [PATCH] FIX: Ios transfroms are cleared after layout --- ui/core/view.ios.ts | 113 +++++++++++++++++--------------------------- 1 file changed, 44 insertions(+), 69 deletions(-) diff --git a/ui/core/view.ios.ts b/ui/core/view.ios.ts index 1186fcb48..a81410d94 100644 --- a/ui/core/view.ios.ts +++ b/ui/core/view.ios.ts @@ -16,81 +16,25 @@ function onIdPropertyChanged(data: dependencyObservable.PropertyChangeData) { view._nativeView.accessibilityIdentifier = data.newValue; } + (viewCommon.View.idProperty.metadata).onSetNativeValue = onIdPropertyChanged; -function onTranslateXPropertyChanged(data: dependencyObservable.PropertyChangeData) { +function onTransfromPropertyChanged(data: dependencyObservable.PropertyChangeData) { var view = data.object; - var newTransform = CGAffineTransformIdentity; - newTransform = CGAffineTransformTranslate(newTransform, data.newValue, view.translateY); - newTransform = CGAffineTransformRotate(newTransform, view.rotate * Math.PI / 180); - newTransform = CGAffineTransformScale(newTransform, view.scaleX, view.scaleY); - if (!CGAffineTransformEqualToTransform(view._nativeView.transform, newTransform)) { - view._nativeView.transform = newTransform; - } + view._updateNativeTransform(); } -(viewCommon.View.translateXProperty.metadata).onSetNativeValue = onTranslateXPropertyChanged; +(viewCommon.View.translateXProperty.metadata).onSetNativeValue = onTransfromPropertyChanged; +(viewCommon.View.translateYProperty.metadata).onSetNativeValue = onTransfromPropertyChanged; +(viewCommon.View.scaleXProperty.metadata).onSetNativeValue = onTransfromPropertyChanged; +(viewCommon.View.scaleYProperty.metadata).onSetNativeValue = onTransfromPropertyChanged; +(viewCommon.View.rotateProperty.metadata).onSetNativeValue = onTransfromPropertyChanged; -function onTranslateYPropertyChanged(data: dependencyObservable.PropertyChangeData) { +function onOriginPropertyChanged(data: dependencyObservable.PropertyChangeData) { var view = data.object; - var newTransform = CGAffineTransformIdentity; - newTransform = CGAffineTransformTranslate(newTransform, view.translateX, data.newValue); - newTransform = CGAffineTransformRotate(newTransform, view.rotate * Math.PI / 180); - newTransform = CGAffineTransformScale(newTransform, view.scaleX, view.scaleY); - if (!CGAffineTransformEqualToTransform(view._nativeView.transform, newTransform)) { - view._nativeView.transform = newTransform; - } + view._updateOriginPoint(); } -(viewCommon.View.translateYProperty.metadata).onSetNativeValue = onTranslateYPropertyChanged; - -function onScaleXPropertyChanged(data: dependencyObservable.PropertyChangeData) { - var view = data.object; - var newTransform = CGAffineTransformIdentity; - newTransform = CGAffineTransformTranslate(newTransform, view.translateX, view.translateY); - newTransform = CGAffineTransformRotate(newTransform, view.rotate * Math.PI / 180); - newTransform = CGAffineTransformScale(newTransform, data.newValue, view.scaleY); - if (!CGAffineTransformEqualToTransform(view._nativeView.transform, newTransform)) { - view._nativeView.transform = newTransform; - } -} -(viewCommon.View.scaleXProperty.metadata).onSetNativeValue = onScaleXPropertyChanged; - -function onScaleYPropertyChanged(data: dependencyObservable.PropertyChangeData) { - var view = data.object; - var newTransform = CGAffineTransformIdentity; - newTransform = CGAffineTransformTranslate(newTransform, view.translateX, view.translateY); - newTransform = CGAffineTransformRotate(newTransform, view.rotate * Math.PI / 180); - newTransform = CGAffineTransformScale(newTransform, view.scaleX, data.newValue); - if (!CGAffineTransformEqualToTransform(view._nativeView.transform, newTransform)) { - view._nativeView.transform = newTransform; - } -} -(viewCommon.View.scaleYProperty.metadata).onSetNativeValue = onScaleYPropertyChanged; - -function onOriginXPropertyChanged(data: dependencyObservable.PropertyChangeData) { - var view = data.object; - var current = view._nativeView.layer.anchorPoint; - view._nativeView.layer.anchorPoint = CGPointMake(data.newValue, current.y); -} -(viewCommon.View.originXProperty.metadata).onSetNativeValue = onOriginXPropertyChanged; - -function onOriginYPropertyChanged(data: dependencyObservable.PropertyChangeData) { - var view = data.object; - var current = view._nativeView.layer.anchorPoint; - view._nativeView.layer.anchorPoint = CGPointMake(current.x, data.newValue); -} -(viewCommon.View.originYProperty.metadata).onSetNativeValue = onOriginYPropertyChanged; - -function onRotatePropertyChanged(data: dependencyObservable.PropertyChangeData) { - var view = data.object; - var newTransform = CGAffineTransformIdentity; - newTransform = CGAffineTransformTranslate(newTransform, view.translateX, view.translateY); - newTransform = CGAffineTransformRotate(newTransform, data.newValue * Math.PI / 180); - newTransform = CGAffineTransformScale(newTransform, view.scaleX, view.scaleY); - if (!CGAffineTransformEqualToTransform(view._nativeView.transform, newTransform)) { - view._nativeView.transform = newTransform; - } -} -(viewCommon.View.rotateProperty.metadata).onSetNativeValue = onRotatePropertyChanged; +(viewCommon.View.originXProperty.metadata).onSetNativeValue = onOriginPropertyChanged; +(viewCommon.View.originYProperty.metadata).onSetNativeValue = onOriginPropertyChanged; function onIsEnabledPropertyChanged(data: dependencyObservable.PropertyChangeData) { var view = data.object; @@ -119,7 +63,9 @@ var PFLAG_MEASURED_DIMENSION_SET = 1 << 1; var PFLAG_LAYOUT_REQUIRED = 1 << 2; export class View extends viewCommon.View { + private _hasTransfrom = false; private _privateFlags: number; + private _cachedFrame: CGRect; constructor() { super(); @@ -249,7 +195,17 @@ export class View extends viewCommon.View { public _setNativeViewFrame(nativeView: any, frame: any) { if (!CGRectEqualToRect(nativeView.frame, frame)) { trace.write(this + ", Native setFrame: = " + NSStringFromCGRect(frame), trace.categories.Layout); - nativeView.frame = frame; + this._cachedFrame = frame; + if (this._hasTransfrom) { + // Always set identity transform before setting frame; + let transform = nativeView.transform; + nativeView.transform = CGAffineTransformIdentity; + nativeView.frame = frame; + nativeView.transform = transform; + } + else { + nativeView.frame = frame; + } var boundsOrigin = nativeView.bounds.origin; nativeView.bounds = CGRectMake(boundsOrigin.x, boundsOrigin.y, frame.size.width, frame.size.height); } @@ -293,6 +249,25 @@ export class View extends viewCommon.View { private _onBoundsChanged() { this.style._boundsChanged(); } + + public _updateNativeTransform() { + var newTransform = CGAffineTransformIdentity; + newTransform = CGAffineTransformTranslate(newTransform, this.translateX, this.translateY); + newTransform = CGAffineTransformRotate(newTransform, this.rotate * Math.PI / 180); + newTransform = CGAffineTransformScale(newTransform, this.scaleX, this.scaleY); + if (!CGAffineTransformEqualToTransform(this._nativeView.transform, newTransform)) { + this._nativeView.transform = newTransform; + this._hasTransfrom = this._nativeView && !CGAffineTransformEqualToTransform(this._nativeView.transform, CGAffineTransformIdentity); + } + } + + public _updateOriginPoint() { + let newPoint = CGPointMake(this.originX, this.originY); + this._nativeView.layer.anchorPoint = newPoint; + if (this._cachedFrame) { + this._setNativeViewFrame(this._nativeView, this._cachedFrame); + } + } } export class CustomLayoutView extends View {