From 8c05da043dea3f8d04420c2d7c9c11733e22258b Mon Sep 17 00:00:00 2001 From: Mikael Sand Date: Sun, 9 Dec 2018 01:24:12 +0200 Subject: [PATCH] [ios] Improve native animated & svg transform interactions with gestures --- ios/Elements/RNSVGGroup.m | 8 ++++---- ios/RNSVGNode.m | 1 - ios/RNSVGRenderable.m | 21 ++++++++++----------- ios/ViewManagers/RNSVGNodeManager.m | 1 - 4 files changed, 14 insertions(+), 17 deletions(-) diff --git a/ios/Elements/RNSVGGroup.m b/ios/Elements/RNSVGGroup.m index 39ac7937..e9021051 100644 --- a/ios/Elements/RNSVGGroup.m +++ b/ios/Elements/RNSVGGroup.m @@ -77,11 +77,10 @@ CGAffineTransform matrix = self.matrix; CGPoint mid = CGPointMake(CGRectGetMidX(bounds), CGRectGetMidY(bounds)); CGPoint center = CGPointApplyAffineTransform(mid, matrix); - CGRect frame = CGRectApplyAffineTransform(bounds, matrix); self.bounds = bounds; self.center = center; - self.frame = frame; + self.frame = bounds; [self popGlyphContext]; } @@ -89,7 +88,8 @@ - (void)setupGlyphContext:(CGContextRef)context { CGRect clipBounds = CGContextGetClipBoundingBox(context); - clipBounds = CGRectApplyAffineTransform(clipBounds, self.transform); + clipBounds = CGRectApplyAffineTransform(clipBounds, self.matrix); + clipBounds = CGRectApplyAffineTransform(clipBounds, self.transforms); CGFloat width = CGRectGetWidth(clipBounds); CGFloat height = CGRectGetHeight(clipBounds); @@ -123,7 +123,7 @@ CGMutablePathRef __block path = CGPathCreateMutable(); [self traverseSubviews:^(RNSVGNode *node) { if ([node isKindOfClass:[RNSVGNode class]]) { - CGAffineTransform transform = node.transform; + CGAffineTransform transform = CGAffineTransformConcat(node.matrix, node.transforms); CGPathAddPath(path, &transform, [node getPath:context]); } return YES; diff --git a/ios/RNSVGNode.m b/ios/RNSVGNode.m index b1d50eb4..1d1708ef 100644 --- a/ios/RNSVGNode.m +++ b/ios/RNSVGNode.m @@ -166,7 +166,6 @@ CGFloat const RNSVG_DEFAULT_FONT_SIZE = 12; } _matrix = matrix; _invmatrix = CGAffineTransformInvert(matrix); - self.transform = CGAffineTransformConcat(matrix, self.transforms); id container = (id)self.superview; [container invalidate]; } diff --git a/ios/RNSVGRenderable.m b/ios/RNSVGRenderable.m index 75d50fa5..e8127d97 100644 --- a/ios/RNSVGRenderable.m +++ b/ios/RNSVGRenderable.m @@ -168,7 +168,8 @@ UInt32 saturate(CGFloat value) { { // This needs to be painted on a layer before being composited. CGContextSaveGState(context); - CGContextConcatCTM(context, self.transform); + CGContextConcatCTM(context, self.matrix); + CGContextConcatCTM(context, self.transforms); CGContextSetAlpha(context, self.opacity); [self beginTransparencyLayer:context]; @@ -296,24 +297,22 @@ UInt32 saturate(CGFloat value) { const CGRect pathBounding = CGPathGetBoundingBox(self.path); - const CGAffineTransform current = CGContextGetCTM(context); - const CGAffineTransform svgToClientTransform = CGAffineTransformConcat(current, self.svgView.invInitialCTM); - const CGRect clientRect = CGRectApplyAffineTransform(pathBounding, svgToClientTransform); + CGAffineTransform current = CGContextGetCTM(context); + CGAffineTransform svgToClientTransform = CGAffineTransformConcat(current, self.svgView.invInitialCTM); + CGRect clientRect = CGRectApplyAffineTransform(pathBounding, svgToClientTransform); self.clientRect = clientRect; - const CGAffineTransform vbmatrix = self.svgView.getViewBoxTransform; - const CGAffineTransform matrix = CGAffineTransformConcat(self.transform, vbmatrix); + CGAffineTransform vbmatrix = self.svgView.getViewBoxTransform; + CGAffineTransform matrix = CGAffineTransformConcat(self.matrix, vbmatrix); - const CGRect bounds = CGRectMake(0, 0, CGRectGetWidth(clientRect), CGRectGetHeight(clientRect)); - const CGPoint mid = CGPointMake(CGRectGetMidX(pathBounding), CGRectGetMidY(pathBounding)); + CGRect bounds = CGRectMake(0, 0, CGRectGetWidth(clientRect), CGRectGetHeight(clientRect)); + CGPoint mid = CGPointMake(CGRectGetMidX(pathBounding), CGRectGetMidY(pathBounding)); CGPoint center = CGPointApplyAffineTransform(mid, matrix); - const CGRect frame = CGRectApplyAffineTransform(pathBounding, matrix); - self.bounds = bounds; self.center = center; - self.frame = frame; + self.frame = clientRect; CGPathDrawingMode mode = kCGPathStroke; BOOL fillColor = NO; diff --git a/ios/ViewManagers/RNSVGNodeManager.m b/ios/ViewManagers/RNSVGNodeManager.m index ebcd652a..1eca8fb2 100644 --- a/ios/ViewManagers/RNSVGNodeManager.m +++ b/ios/ViewManagers/RNSVGNodeManager.m @@ -160,7 +160,6 @@ RCT_CUSTOM_VIEW_PROPERTY(transform, CATransform3D, RNSVGNode) CGAffineTransform transform = CATransform3DGetAffineTransform(transform3d); view.invTransform = CGAffineTransformInvert(transform); view.transforms = transform; - view.transform = CGAffineTransformConcat(view.matrix, transform); [view invalidate]; } RCT_EXPORT_VIEW_PROPERTY(mask, NSString)