* [ios] fix transitionProperty:backgroundColor bug

Project: http://git-wip-us.apache.org/repos/asf/incubator-weex/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-weex/commit/4a3a7809
Tree: http://git-wip-us.apache.org/repos/asf/incubator-weex/tree/4a3a7809
Diff: http://git-wip-us.apache.org/repos/asf/incubator-weex/diff/4a3a7809

Branch: refs/heads/0.16-dev
Commit: 4a3a78092756f9229b6840d70db6b602d7fdf1fd
Parents: 02658e3
Author: doumafang <doumaf...@gmail.com>
Authored: Fri Aug 11 18:13:56 2017 +0800
Committer: doumafang <doumaf...@gmail.com>
Committed: Fri Aug 11 18:13:56 2017 +0800

----------------------------------------------------------------------
 .../Sources/Component/WXComponent_internal.h    |  1 -
 .../Sources/Display/WXComponent+Display.m       | 16 +++++-
 ios/sdk/WeexSDK/Sources/Model/WXComponent.m     | 30 ++++++-----
 .../WeexSDK/Sources/Module/WXAnimationModule.m  | 10 ++--
 ios/sdk/WeexSDK/Sources/Module/WXTransition.h   |  5 ++
 ios/sdk/WeexSDK/Sources/Module/WXTransition.m   | 56 ++++++++++++--------
 6 files changed, 77 insertions(+), 41 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/4a3a7809/ios/sdk/WeexSDK/Sources/Component/WXComponent_internal.h
----------------------------------------------------------------------
diff --git a/ios/sdk/WeexSDK/Sources/Component/WXComponent_internal.h 
b/ios/sdk/WeexSDK/Sources/Component/WXComponent_internal.h
index 49db7a9..1e11f4f 100644
--- a/ios/sdk/WeexSDK/Sources/Component/WXComponent_internal.h
+++ b/ios/sdk/WeexSDK/Sources/Component/WXComponent_internal.h
@@ -181,7 +181,6 @@
 
 - (void)_modifyStyles:(NSDictionary *)styles;
 
-
 - (void)_initCSSNodeWithStyles:(NSDictionary *)styles;
 
 - (void)_updateCSSNodeStyles:(NSDictionary *)styles;

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/4a3a7809/ios/sdk/WeexSDK/Sources/Display/WXComponent+Display.m
----------------------------------------------------------------------
diff --git a/ios/sdk/WeexSDK/Sources/Display/WXComponent+Display.m 
b/ios/sdk/WeexSDK/Sources/Display/WXComponent+Display.m
index 57594de..5d22939 100644
--- a/ios/sdk/WeexSDK/Sources/Display/WXComponent+Display.m
+++ b/ios/sdk/WeexSDK/Sources/Display/WXComponent+Display.m
@@ -553,9 +553,23 @@ do {\
             [self _resetNativeBorderRadius];
             _layer.borderWidth = _borderTopWidth;
             _layer.borderColor = _borderTopColor.CGColor;
-            _layer.backgroundColor = _backgroundColor.CGColor;
+            if (![self _isTransitionBackgroundColorStyles:styles]) {
+                _layer.backgroundColor = _backgroundColor.CGColor;
+            }
+        }
+    }
+}
+
+- (BOOL)_isTransitionBackgroundColorStyles:(NSDictionary *)styles
+{
+    BOOL yesOrNo = false;
+    NSString *property = self.styles[kWXTransitionProperty];
+    if (property) {
+        if (([property containsString:@"backgroundColor"])) {
+            yesOrNo = true;
         }
     }
+    return yesOrNo;
 }
 
 - (BOOL)_bitmapOpaqueWithSize:(CGSize)size

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/4a3a7809/ios/sdk/WeexSDK/Sources/Model/WXComponent.m
----------------------------------------------------------------------
diff --git a/ios/sdk/WeexSDK/Sources/Model/WXComponent.m 
b/ios/sdk/WeexSDK/Sources/Model/WXComponent.m
index 669603f..124b769 100644
--- a/ios/sdk/WeexSDK/Sources/Model/WXComponent.m
+++ b/ios/sdk/WeexSDK/Sources/Model/WXComponent.m
@@ -433,10 +433,9 @@
 }
 
 #pragma mark Updating
-
 - (void)_updateStylesOnComponentThread:(NSDictionary *)styles 
resetStyles:(NSMutableArray *)resetStyles isUpdateStyles:(BOOL)isUpdateStyles
 {
-    if ([self _isPropertyTransition]) {
+    if ([self _isPropertyTransitionStyles:styles]) {
         if (!_transition) {
             _transition = [WXTransition new];
         }
@@ -455,32 +454,40 @@
     [self _resetCSSNodeStyles:resetStyles];
 }
 
-- (BOOL)_isPropertyTransition
+- (BOOL)_isPropertyTransitionStyles:(NSDictionary *)styles
 {
     BOOL yesOrNo = false;
-    NSString *property = _styles[@"transitionProperty"];
+    NSString *property = _styles[kWXTransitionProperty];
     if (property) {
-        if ([property containsString:@"width"]||[property 
containsString:@"height"]||[property containsString:@"top"]||[property 
containsString:@"bottom"]||[property containsString:@"right"]||[property 
containsString:@"left"]||[property containsString:@"transform"]||[property 
containsString:@"backgroundColor"]||[property containsString:@"opacity"]) {
+        if (([property containsString:@"width"]&&styles[@"width"])
+            ||([property containsString:@"height"]&&styles[@"height"])
+            ||([property containsString:@"right"]&&styles[@"right"])
+            ||([property containsString:@"left"]&&styles[@"left"])
+            ||([property containsString:@"bottom"]&&styles[@"bottom"])
+            ||([property containsString:@"top"]&&styles[@"top"])
+            ||([property 
containsString:@"backgroundColor"]&&styles[@"backgroundColor"])
+            ||([property containsString:@"transform"]&&styles[@"transform"])
+            ||([property containsString:@"opacity"]&&styles[@"opacity"])) {
             yesOrNo = true;
         }
     }
     return yesOrNo;
 }
 
-
-- (BOOL)_isPropertyAnimation
+- (BOOL)_isPropertyAnimationStyles:(NSDictionary *)styles
 {
     BOOL yesOrNo = false;
-    NSString *property = _styles[@"transitionProperty"];
+    NSString *property = _styles[kWXTransitionProperty];
     if (property) {
-        if ([property containsString:@"transform"]||[property 
containsString:@"backgroundColor"]||[property containsString:@"opacity"]) {
+        if (([property 
containsString:@"backgroundColor"]&&styles[@"backgroundColor"])
+            ||([property containsString:@"transform"]&&styles[@"transform"])
+            ||([property containsString:@"opacity"]&&styles[@"opacity"])) {
             yesOrNo = true;
         }
     }
     return yesOrNo;
 }
 
-
 - (void)_modifyStyles:(NSDictionary *)styles
 {
     pthread_mutex_lock(&_propertyMutex);
@@ -512,12 +519,11 @@
 - (void)_updateStylesOnMainThread:(NSDictionary *)styles 
resetStyles:(NSMutableArray *)resetStyles
 {
     WXAssertMainThread();
-    if (![self _isPropertyAnimation]) {
+    if (![self _isPropertyAnimationStyles:styles]) {
         [self _updateViewStyles:styles];
     }
     [self _resetStyles:resetStyles];
     [self _handleBorders:styles isUpdating:YES];
-    
     [self updateStyles:styles];
     [self resetStyles:resetStyles];
 }

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/4a3a7809/ios/sdk/WeexSDK/Sources/Module/WXAnimationModule.m
----------------------------------------------------------------------
diff --git a/ios/sdk/WeexSDK/Sources/Module/WXAnimationModule.m 
b/ios/sdk/WeexSDK/Sources/Module/WXAnimationModule.m
index dc01af3..fa49d9e 100644
--- a/ios/sdk/WeexSDK/Sources/Module/WXAnimationModule.m
+++ b/ios/sdk/WeexSDK/Sources/Module/WXAnimationModule.m
@@ -313,9 +313,9 @@ WX_EXPORT_METHOD(@selector(transition:args:callback:))
     NSDictionary *styles = args[@"styles"];
     _transition.addStyles = [NSMutableDictionary 
dictionaryWithDictionary:styles];
     _transition.fromStyles =_transition.fromStyles ? :[NSMutableDictionary 
dictionaryWithDictionary:target.styles] ;
-    [_transition.fromStyles setObject:@([args[@"duration"] doubleValue]) 
forKey:@"transitionDuration"];
-    [_transition.fromStyles setObject:@([args[@"delay"] doubleValue]) 
forKey:@"transitionDelay"];
-    NSString *oldProperty = _transition.fromStyles[@"transitionProperty"];
+    [_transition.fromStyles setObject:@([args[@"duration"] doubleValue]) 
forKey:kWXTransitionDuration];
+    [_transition.fromStyles setObject:@([args[@"delay"] doubleValue]) 
forKey:kWXTransitionDelay];
+    NSString *oldProperty = _transition.fromStyles[kWXTransitionProperty];
     NSString *newProperty;
     if (oldProperty) {
         if ([oldProperty containsString:property]) {
@@ -330,8 +330,8 @@ WX_EXPORT_METHOD(@selector(transition:args:callback:))
     {
         newProperty = property;
     }
-    [_transition.fromStyles setObject:newProperty 
forKey:@"transitionProperty"];
-    [_transition.fromStyles setObject:args[@"timingFunction"] 
forKey:@"transitionTimingFunction"];
+    [_transition.fromStyles setObject:newProperty 
forKey:kWXTransitionProperty];
+    [_transition.fromStyles setObject:args[@"timingFunction"] 
forKey:kWXTransitionTimingFunction];
     [target _modifyStyles:styles];
     
 }

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/4a3a7809/ios/sdk/WeexSDK/Sources/Module/WXTransition.h
----------------------------------------------------------------------
diff --git a/ios/sdk/WeexSDK/Sources/Module/WXTransition.h 
b/ios/sdk/WeexSDK/Sources/Module/WXTransition.h
index 9a0d5a8..19870d2 100644
--- a/ios/sdk/WeexSDK/Sources/Module/WXTransition.h
+++ b/ios/sdk/WeexSDK/Sources/Module/WXTransition.h
@@ -19,6 +19,11 @@
 
 #import <Foundation/Foundation.h>
 
+#define kWXTransitionDuration                   @"transitionDuration"
+#define kWXTransitionProperty                   @"transitionProperty"
+#define kWXTransitionDelay                      @"transitionDelay"
+#define kWXTransitionTimingFunction             @"transitionTimingFunction"
+
 @interface WXLayoutAnimationInfo : NSObject
 @property (nonatomic, strong) id fromValue;
 @property (nonatomic, strong) id toValue;

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/4a3a7809/ios/sdk/WeexSDK/Sources/Module/WXTransition.m
----------------------------------------------------------------------
diff --git a/ios/sdk/WeexSDK/Sources/Module/WXTransition.m 
b/ios/sdk/WeexSDK/Sources/Module/WXTransition.m
index 26d9fb9..8758270 100644
--- a/ios/sdk/WeexSDK/Sources/Module/WXTransition.m
+++ b/ios/sdk/WeexSDK/Sources/Module/WXTransition.m
@@ -75,15 +75,14 @@
     {
         [_addStyles addEntriesFromDictionary:styles];
     }
-    
     _toStyles = [NSMutableDictionary dictionaryWithDictionary:_fromStyles];
     [_toStyles addEntriesFromDictionary:_addStyles];
     
-    _layoutAnimationDuration = _fromStyles[@"transitionDuration"] ? [WXConvert 
CGFloat:_fromStyles[@"transitionDuration"]] : 0;
-    _layoutAnimationDelay = _fromStyles[@"transitionDelay"] ? [WXConvert 
CGFloat:_fromStyles[@"transitionDelay"]] : 0;
-    _layoutAnimationTimingFunction = [WXConvert 
CAMediaTimingFunction:_fromStyles[@"transitionTimingFunction"]];
+    _layoutAnimationDuration = _fromStyles[kWXTransitionDuration] ? [WXConvert 
CGFloat:_fromStyles[kWXTransitionDuration]] : 0;
+    _layoutAnimationDelay = _fromStyles[kWXTransitionDelay] ? [WXConvert 
CGFloat:_fromStyles[kWXTransitionDelay]] : 0;
+    _layoutAnimationTimingFunction = [WXConvert 
CAMediaTimingFunction:_fromStyles[kWXTransitionTimingFunction]];
     
-    if (_layoutAnimationDuration == 0) {
+    if (_layoutAnimationDuration == 0 ) {
         [targetComponent _updateCSSNodeStyles:styles];
         WXPerformBlockOnMainThread(^{
             [targetComponent _updateViewStyles:styles];
@@ -98,42 +97,54 @@
         [self unitBezierp1x:vec[0] p1y:vec[1] p2x:vec[2] p2y:vec[3]];
     }
     
-    NSString *layoutAnimationProperty = _fromStyles[@"transitionProperty"];
+    NSString *layoutAnimationProperty = _fromStyles[kWXTransitionProperty];
     [self _resloveTransitionProperty:layoutAnimationProperty 
withStyles:styles];
     [self performSelector:@selector(_startLayoutAnimationDisplayLink) 
withObject:self afterDelay:_layoutAnimationDelay/1000];
 }
 
 - (void)_resloveTransitionProperty:(NSString *)propertyNames 
withStyles:(NSDictionary *)styles
 {
-    NSArray *array = 
@[@"width",@"height",@"top",@"bottom",@"right",@"left",@"transform",@"backgroundColor",@"opacity"];
+    NSArray *array = @[@"width",@"height",@"top",@"bottom",@"right",@"left"];
     for (NSString *propertyName in array) {
         if ([propertyNames containsString:propertyName]) {
-            [self _judgeProperty:propertyName withStyles:styles];
+            [self _judgeProperty:propertyName ];
+        }
+    }
+    NSArray *animationModuleArray = 
@[@"transform",@"backgroundColor",@"opacity"];
+    for (NSString *propertyName in animationModuleArray) {
+        if ([propertyNames containsString:propertyName]) {
+            [self _dealWithAnimationModuleProperty:propertyName styles:styles];
         }
     }
 }
 
-- (void)_judgeProperty:(NSString *)singleProperty withStyles:(NSDictionary 
*)styles
+- (void)_judgeProperty:(NSString *)singleProperty
 {
-    if (([singleProperty isEqualToString:@"transform"]&&styles[@"transform"]) 
|| ([singleProperty 
containsString:@"backgroundColor"]&&styles[@"backgroundColor"]) || 
([singleProperty containsString:@"opacity"]&&styles[@"opacity"])) {
-        NSDictionary *args = 
@{@"delay":@(_layoutAnimationDelay),@"duration":@(_layoutAnimationDuration),@"styles":styles,@"timingFunction":_fromStyles[@"transitionTimingFunction"]};
-        [self _animationModuleHandleTransition:args];
+    WXLayoutAnimationInfo *info = [WXLayoutAnimationInfo new];
+    info.fromValue = @(_fromStyles[singleProperty] ? [WXConvert 
CGFloat:_fromStyles[singleProperty]] : 0);
+    info.toValue = @(_toStyles[singleProperty] ? [WXConvert 
CGFloat:_toStyles[singleProperty]] : 0 );
+    info.perValue = @([info.toValue doubleValue] - [info.fromValue 
doubleValue]);
+    info.propertyName = singleProperty;
+    if (!_propertyArray) {
+        _propertyArray = [NSMutableArray new];
     }
-    else{
-        WXLayoutAnimationInfo *info = [WXLayoutAnimationInfo new];
-        info.fromValue = @(_fromStyles[singleProperty] ? [WXConvert 
CGFloat:_fromStyles[singleProperty]] : 0);
-        info.toValue = @(_toStyles[singleProperty] ? [WXConvert 
CGFloat:_toStyles[singleProperty]] : 0 );
-        info.perValue = @([info.toValue doubleValue] - [info.fromValue 
doubleValue]);
-        info.propertyName = singleProperty;
-        if (!_propertyArray) {
-            _propertyArray = [NSMutableArray new];
-        }
-        [_propertyArray addObject:info];
+    [_propertyArray addObject:info];
+}
+
+- (void)_dealWithAnimationModuleProperty:(NSString *)singleProperty 
styles:(NSDictionary *)styles
+{
+    if ([singleProperty 
isEqualToString:singleProperty]&&styles[singleProperty])
+    {
+        NSDictionary *args = 
@{@"delay":@(_layoutAnimationDelay),@"duration":@(_layoutAnimationDuration),@"styles":styles,@"timingFunction":_fromStyles[kWXTransitionTimingFunction]};
+        [self _animationModuleHandleTransition:args];
     }
 }
 
 - (void)_calculateLayoutAnimationProcessingStyle
 {
+    if (_propertyArray.count == 0) {
+        return;
+    }
     double per = 1000 * (_layoutAnimationCount + 1 ) / (60 * 
_layoutAnimationDuration);//linear
     if (![[NSString stringWithFormat:@"%@",_layoutAnimationTimingFunction] 
isEqualToString: kCAMediaTimingFunctionLinear]) {
         per = [self 
solveWithx:((_layoutAnimationCount+2)*16)/_layoutAnimationDuration 
epsilon:SOLVE_EPS(_layoutAnimationDuration)];
@@ -204,6 +215,7 @@
 {
     _layoutAnimationCount = 0;
     _layoutAnimationDuration = 0;
+    _propertyArray = nil;
 
 }
 

Reply via email to