* [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; }