You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@weex.apache.org by so...@apache.org on 2017/02/28 02:30:10 UTC

[30/50] incubator-weex git commit: + [ios] box-shadow:add reset and compare with last boxshadow

+ [ios] box-shadow:add reset and compare with last boxshadow


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

Branch: refs/heads/0.11-dev
Commit: 936a7a77afbecb01ef6c0029f4d11a5095a09154
Parents: d543d44
Author: \u9f50\u5c71 <su...@163.com>
Authored: Thu Feb 23 20:18:11 2017 +0800
Committer: \u9f50\u5c71 <su...@163.com>
Committed: Thu Feb 23 20:18:11 2017 +0800

----------------------------------------------------------------------
 .../Sources/Component/WXComponent_internal.h    |  2 +
 .../WeexSDK/Sources/Layout/WXComponent+Layout.m |  3 +
 ios/sdk/WeexSDK/Sources/Model/WXComponent.m     | 10 +++-
 ios/sdk/WeexSDK/Sources/Utility/WXBoxShadow.h   | 44 +++++++++++++-
 ios/sdk/WeexSDK/Sources/Utility/WXBoxShadow.m   | 61 +++++++++++++++++---
 ios/sdk/WeexSDK/Sources/Utility/WXConvert.h     |  2 +-
 ios/sdk/WeexSDK/Sources/Utility/WXConvert.m     |  4 +-
 .../Sources/View/WXComponent+ViewManagement.m   | 13 ++++-
 8 files changed, 121 insertions(+), 18 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/936a7a77/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 daa404c..fdd1802 100644
--- a/ios/sdk/WeexSDK/Sources/Component/WXComponent_internal.h
+++ b/ios/sdk/WeexSDK/Sources/Component/WXComponent_internal.h
@@ -40,6 +40,8 @@
     UIView *_view;
     CGFloat _opacity;
     WXVisibility  _visibility;
+    WXBoxShadow *_originalBoxShadow;
+    WXBoxShadow *_lastBoxShadow;
     WXBoxShadow *_boxShadow;
     
     /**

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/936a7a77/ios/sdk/WeexSDK/Sources/Layout/WXComponent+Layout.m
----------------------------------------------------------------------
diff --git a/ios/sdk/WeexSDK/Sources/Layout/WXComponent+Layout.m b/ios/sdk/WeexSDK/Sources/Layout/WXComponent+Layout.m
index bd6feca..d457733 100644
--- a/ios/sdk/WeexSDK/Sources/Layout/WXComponent+Layout.m
+++ b/ios/sdk/WeexSDK/Sources/Layout/WXComponent+Layout.m
@@ -117,6 +117,9 @@
             }
             
             strongSelf.view.frame = strongSelf.calculatedFrame;
+            if (![WXBoxShadow EqualBoxShadow:_boxShadow withBoxShadow:_lastBoxShadow]) {
+                [WXBoxShadow configViewLayer:strongSelf.view boxShadow:_boxShadow lastBoxShadow:_lastBoxShadow originalBoxShadow:_originalBoxShadow];
+            }
             
             if (strongSelf->_transform) {
                 [strongSelf->_transform applyTransformForView:strongSelf.view];

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/936a7a77/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 383366a..126754c 100644
--- a/ios/sdk/WeexSDK/Sources/Model/WXComponent.m
+++ b/ios/sdk/WeexSDK/Sources/Model/WXComponent.m
@@ -201,9 +201,8 @@
             [self _resetNativeBorderRadius];
             _layer.opacity = _opacity;
             _view.backgroundColor = _backgroundColor;
-            [WXBoxShadow configLayer:self.view boxShadow:_boxShadow];
         }
-        
+
         if (_backgroundImage) {
             [self setGradientLayer];
         }
@@ -212,6 +211,11 @@
             [_transform applyTransformForView:_view];
         }
         
+        if (_boxShadow) {
+            _originalBoxShadow = [WXBoxShadow getViewBoxShadow:self.view];
+            [WXBoxShadow configViewLayer:self.view boxShadow:_boxShadow lastBoxShadow:_lastBoxShadow originalBoxShadow:_originalBoxShadow];
+        }
+        
         _view.wx_component = self;
         _view.wx_ref = self.ref;
         _layer.wx_component = self;
@@ -233,7 +237,7 @@
         if (_lazyCreateView) {
             [self _buildViewHierarchyLazily];
         }
-        
+
         [self _handleFirstScreenTime];
         
         return _view;

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/936a7a77/ios/sdk/WeexSDK/Sources/Utility/WXBoxShadow.h
----------------------------------------------------------------------
diff --git a/ios/sdk/WeexSDK/Sources/Utility/WXBoxShadow.h b/ios/sdk/WeexSDK/Sources/Utility/WXBoxShadow.h
index 9f8ba62..1d215d5 100644
--- a/ios/sdk/WeexSDK/Sources/Utility/WXBoxShadow.h
+++ b/ios/sdk/WeexSDK/Sources/Utility/WXBoxShadow.h
@@ -18,6 +18,46 @@
 @property (nonatomic, strong, nullable)WXInnerLayer *innerLayer;
 @property CGFloat shadowOpacity;
 
-+(void)configLayer:(UIView *_Nullable)view boxShadow:(WXBoxShadow *_Nullable)boxShadow;
-+(WXBoxShadow *_Nullable)getBoxShadowFromString:(NSString *_Nullable)string;
+/**
+ *  @abstract get boxshadow from view
+ *
+ *  @param view
+ *
+ *  @return A WXBoxShadow object
+ */
++(WXBoxShadow *)getViewBoxShadow:(UIView *_Nullable)view;
+
+/**
+ *  @abstract compare boxshadow
+ *
+ *  @param boxShadow
+ *
+ *  @param view
+ *
+ *  @return if not equal return NO, if equal return YES
+ */
++(BOOL)EqualBoxShadow:(WXBoxShadow *_Nullable)boxShadow withBoxShadow:(WXBoxShadow *_Nullable)compareBoxShadow;
+
+/**
+ *  @abstract config view Layer with boxshadow, lastboxshadow and originalBoxShadow
+ *
+ *  @param boxShadow the boxshadow will be set
+ *
+ *  @param lastboxshadow the boxshadow set last time
+ *
+ *  @param originalBoxShadow the view  original boxshadow
+ *
+ */
++(void)configViewLayer:(UIView *_Nullable)view boxShadow:(WXBoxShadow *_Nullable)boxShadow lastBoxShadow:(WXBoxShadow *_Nullable)lastBoxShadow originalBoxShadow:(WXBoxShadow *_Nullable)originalBoxShadow;
+
+/**
+ *  @abstract get boxshadow from string and adapter phone screen
+ *
+ *  @param string the boxshadow string
+ *
+ *  @param scaleFactor the boxshadow set last time
+ *
+ *  @return A WXBoxShadow object
+ */
++(WXBoxShadow *_Nullable)getBoxShadowFromString:(NSString *_Nullable)string scaleFactor:(CGFloat)scaleFactor;
 @end

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/936a7a77/ios/sdk/WeexSDK/Sources/Utility/WXBoxShadow.m
----------------------------------------------------------------------
diff --git a/ios/sdk/WeexSDK/Sources/Utility/WXBoxShadow.m b/ios/sdk/WeexSDK/Sources/Utility/WXBoxShadow.m
index c56f365..0708217 100644
--- a/ios/sdk/WeexSDK/Sources/Utility/WXBoxShadow.m
+++ b/ios/sdk/WeexSDK/Sources/Utility/WXBoxShadow.m
@@ -8,12 +8,58 @@
 
 #import "WXBoxShadow.h"
 #import "WXConvert.h"
+#import "WXUtility.h"
 
 @implementation WXBoxShadow
 
-+(void)configLayer:(UIView *)view boxShadow:(WXBoxShadow *)boxShadow
++(WXBoxShadow *)getViewBoxShadow:(UIView *_Nullable)view
 {
-    if(!boxShadow){
+    WXBoxShadow *boxShadow = [WXBoxShadow new];
+    boxShadow.shadowColor = view.layer.shadowColor;
+    boxShadow.shadowOffset = view.layer.shadowOffset;
+    boxShadow.shadowRadius = view.layer.shadowRadius;
+    boxShadow.shadowOpacity =  view.layer.shadowOpacity;
+    return boxShadow;
+}
+
++(void)resetViewLayer:(UIView *_Nullable)view lastBoxShadow:(WXBoxShadow *_Nullable)lastBoxShadow  boxShadow:(WXBoxShadow *_Nullable)originalBoxShadow
+{
+    UIBezierPath *shadowPath = [UIBezierPath bezierPathWithRect:view.bounds];
+    view.layer.masksToBounds = NO;
+    view.layer.shadowColor = originalBoxShadow.shadowColor;
+    view.layer.shadowOffset = originalBoxShadow.shadowOffset;
+    view.layer.shadowRadius = originalBoxShadow.shadowRadius;
+    view.layer.shadowOpacity = originalBoxShadow.shadowOpacity;
+    view.layer.shadowPath = shadowPath.CGPath;
+    if (lastBoxShadow.innerLayer) {
+        if (lastBoxShadow.innerLayer) {
+            [lastBoxShadow.innerLayer removeFromSuperlayer];
+        }
+    }
+}
+
+// if not equal return NO, if equal return YES
++(BOOL)EqualBoxShadow:(WXBoxShadow *_Nullable)boxShadow withBoxShadow:(WXBoxShadow *_Nullable)compareBoxShadow
+{
+    if(!compareBoxShadow && !boxShadow) {
+        return YES;
+    } else if (CGColorEqualToColor(boxShadow.shadowColor,compareBoxShadow.shadowColor) &&
+        CGSizeEqualToSize(boxShadow.shadowOffset,compareBoxShadow.shadowOffset) &&
+        WXFloatEqual(boxShadow.shadowRadius,compareBoxShadow.shadowRadius)&& (boxShadow.isInset == boxShadow.isInset))
+    {
+        return YES;
+    }
+    return NO;
+    
+}
+
++(void)configViewLayer:(UIView *_Nullable)view boxShadow:(WXBoxShadow *_Nullable)boxShadow lastBoxShadow:(WXBoxShadow *_Nullable)lastBoxShadow originalBoxShadow:(WXBoxShadow *_Nullable)originalBoxShadow
+{
+    if (!boxShadow && !lastBoxShadow) {
+        return;
+    }
+    [self resetViewLayer:view lastBoxShadow:lastBoxShadow boxShadow:originalBoxShadow];
+    if (!boxShadow) {
         return;
     }
     if (boxShadow.isInset) {
@@ -49,7 +95,7 @@
     return array;
 }
 
-+(WXBoxShadow *)getBoxShadowFromString:(NSString *)string
++(WXBoxShadow *_Nullable)getBoxShadowFromString:(NSString *_Nullable)string scaleFactor:(CGFloat)scaleFactor
 {
     if ([string length] == 0) {
         return nil;
@@ -64,8 +110,7 @@
         if (begin.location < end.location && end.location < [string length]) {
             NSRange range = NSMakeRange(begin.location, end.location-begin.location + 1);
             NSString *str = [string substringWithRange:range];
-            NSString *colorStr = [str stringByReplacingOccurrencesOfString:@" " withString:@""];
-            boxShadow.shadowColor = [WXConvert UIColor:colorStr].CGColor;
+            boxShadow.shadowColor = [WXConvert UIColor:str].CGColor;
             string = [string stringByReplacingOccurrencesOfString:str withString:@""];// remove color string
         }
     } else {
@@ -91,20 +136,20 @@
                 case 0:
                 {
                     CGSize size = boxShadow.shadowOffset;
-                    size.width = [WXConvert CGFloat:remainBoxShadowElements[0]];
+                    size.width = [WXConvert WXPixelType:remainBoxShadowElements[0] scaleFactor:scaleFactor];
                     boxShadow.shadowOffset = size;
                 }
                     break;
                 case 1:
                 {
                     CGSize size = boxShadow.shadowOffset;
-                    size.height = [WXConvert CGFloat:remainBoxShadowElements[1]];
+                    size.height = [WXConvert WXPixelType:remainBoxShadowElements[1] scaleFactor:scaleFactor];
                     boxShadow.shadowOffset = size;
                 }
                     break;
                 case 2:
                 {
-                    boxShadow.shadowRadius = [WXConvert CGFloat:remainBoxShadowElements[2]];
+                    boxShadow.shadowRadius = [WXConvert WXPixelType:remainBoxShadowElements[2] scaleFactor:scaleFactor];
                 }
                     break;
                     

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/936a7a77/ios/sdk/WeexSDK/Sources/Utility/WXConvert.h
----------------------------------------------------------------------
diff --git a/ios/sdk/WeexSDK/Sources/Utility/WXConvert.h b/ios/sdk/WeexSDK/Sources/Utility/WXConvert.h
index ecd6c4c..d9312bc 100644
--- a/ios/sdk/WeexSDK/Sources/Utility/WXConvert.h
+++ b/ios/sdk/WeexSDK/Sources/Utility/WXConvert.h
@@ -69,7 +69,7 @@ typedef BOOL WXClipType;
 
 + (WXGradientType)gradientType:(id)value;
 
-+ (WXBoxShadow *)WXBoxShadow:(id)value;
++ (WXBoxShadow *)WXBoxShadow:(id)value scaleFactor:(CGFloat)scaleFactor;
 
 @end
 

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/936a7a77/ios/sdk/WeexSDK/Sources/Utility/WXConvert.m
----------------------------------------------------------------------
diff --git a/ios/sdk/WeexSDK/Sources/Utility/WXConvert.m b/ios/sdk/WeexSDK/Sources/Utility/WXConvert.m
index 99c3ee3..c497d28 100644
--- a/ios/sdk/WeexSDK/Sources/Utility/WXConvert.m
+++ b/ios/sdk/WeexSDK/Sources/Utility/WXConvert.m
@@ -723,7 +723,7 @@ WX_NUMBER_CONVERT(NSUInteger, unsignedIntegerValue)
     return type;
 }
 
-+ (WXBoxShadow *)WXBoxShadow:(id)value
++ (WXBoxShadow *)WXBoxShadow:(id)value scaleFactor:(CGFloat)scaleFactor
 {
     NSString *boxShadow = @"";
     if([value isKindOfClass:[NSString class]]){
@@ -735,7 +735,7 @@ WX_NUMBER_CONVERT(NSUInteger, unsignedIntegerValue)
         WXLogError(@"Convert Error:%@ can not be converted to boxshadow type", value);
     }
     if (boxShadow) {
-        return [WXBoxShadow getBoxShadowFromString:boxShadow];
+        return [WXBoxShadow getBoxShadowFromString:boxShadow scaleFactor:scaleFactor];
     }
     return nil;
 }

http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/936a7a77/ios/sdk/WeexSDK/Sources/View/WXComponent+ViewManagement.m
----------------------------------------------------------------------
diff --git a/ios/sdk/WeexSDK/Sources/View/WXComponent+ViewManagement.m b/ios/sdk/WeexSDK/Sources/View/WXComponent+ViewManagement.m
index 541c7d5..86495eb 100644
--- a/ios/sdk/WeexSDK/Sources/View/WXComponent+ViewManagement.m
+++ b/ios/sdk/WeexSDK/Sources/View/WXComponent+ViewManagement.m
@@ -102,13 +102,17 @@
     _transform = styles[@"transform"] || styles[@"transformOrigin"] ?
     [[WXTransform alloc] initWithCSSValue:[WXConvert NSString:styles[@"transform"]] origin:styles[@"transformOrigin"] instance:self.weexInstance] :
     [[WXTransform alloc] initWithCSSValue:nil origin:nil instance:self.weexInstance];
-    _boxShadow = styles[@"boxShadow"]?[WXConvert WXBoxShadow:styles[@"boxShadow"]]:nil;
+    _boxShadow = styles[@"boxShadow"]?[WXConvert WXBoxShadow:styles[@"boxShadow"] scaleFactor:self.weexInstance.pixelScaleFactor]:nil;
+    if (_boxShadow) {
+        _lastBoxShadow = _boxShadow;
+    }
 }
 
 - (void)_updateViewStyles:(NSDictionary *)styles
 {
     if (styles[@"boxShadow"]) {
-        [WXBoxShadow configLayer:self.view boxShadow:[WXConvert WXBoxShadow:styles[@"boxShadow"]]];
+        _lastBoxShadow = _boxShadow;
+        _boxShadow = styles[@"boxShadow"]?[WXConvert WXBoxShadow:styles[@"boxShadow"] scaleFactor:self.weexInstance.pixelScaleFactor]:nil;
         [self setNeedsDisplay];
     }
     
@@ -185,6 +189,11 @@
         _layer.backgroundColor = _backgroundColor.CGColor;
         [self setNeedsDisplay];
     }
+    if (styles && [styles containsObject:@"boxShadow"]) {
+        _lastBoxShadow = _boxShadow;
+        _boxShadow = nil;
+        [self setNeedsDisplay];
+    }
 }
 
 - (void)_unloadViewWithReusing:(BOOL)isReusing