diff --git a/ios/Elements/RNSVGClipPath.m b/ios/Elements/RNSVGClipPath.m index 234a2877..3ea72d6f 100644 --- a/ios/Elements/RNSVGClipPath.m +++ b/ios/Elements/RNSVGClipPath.m @@ -17,7 +17,7 @@ - (void)parseReference { - [[self getSvgView] defineClipPath:self clipPathName:self.name]; + [self.svgView defineClipPath:self clipPathName:self.name]; } diff --git a/ios/Elements/RNSVGGroup.m b/ios/Elements/RNSVGGroup.m index c2ec51ae..14e64429 100644 --- a/ios/Elements/RNSVGGroup.m +++ b/ios/Elements/RNSVGGroup.m @@ -33,10 +33,10 @@ - (void)renderGroupTo:(CGContextRef)context { [self pushGlyphContext]; - RNSVGSvgView* svg = [self getSvgView]; + [self traverseSubviews:^(RNSVGNode *node) { - if (node.responsible && !svg.responsible) { - svg.responsible = YES; + if (node.responsible && !self.svgView.responsible) { + self.svgView.responsible = YES; } if ([node isKindOfClass:[RNSVGRenderable class]]) { @@ -142,8 +142,8 @@ - (void)parseReference { if (self.name) { - RNSVGSvgView* svg = [self getSvgView]; - [svg defineTemplate:self templateName:self.name]; + typeof(self) __weak weakSelf = self; + [self.svgView defineTemplate:weakSelf templateName:self.name]; } [self traverseSubviews:^(__kindof RNSVGNode *node) { diff --git a/ios/Elements/RNSVGLinearGradient.m b/ios/Elements/RNSVGLinearGradient.m index 12f72538..657ce556 100644 --- a/ios/Elements/RNSVGLinearGradient.m +++ b/ios/Elements/RNSVGLinearGradient.m @@ -34,12 +34,11 @@ [painter setTransform:self.gradientTransform]; [painter setLinearGradientColors:self.gradient]; - RNSVGSvgView *svg = [self getSvgView]; if (self.gradientUnits == kRNSVGUnitsUserSpaceOnUse) { - [painter setUserSpaceBoundingBox:[svg getContextBounds]]; + [painter setUserSpaceBoundingBox:[self.svgView getContextBounds]]; } - [svg definePainter:painter painterName:self.name]; + [self.svgView definePainter:painter painterName:self.name]; } @end diff --git a/ios/Elements/RNSVGRadialGradient.m b/ios/Elements/RNSVGRadialGradient.m index be7c41e5..f214b548 100644 --- a/ios/Elements/RNSVGRadialGradient.m +++ b/ios/Elements/RNSVGRadialGradient.m @@ -32,12 +32,11 @@ [painter setTransform:self.gradientTransform]; [painter setRadialGradientColors:self.gradient]; - RNSVGSvgView *svg = [self getSvgView]; if (self.gradientUnits == kRNSVGUnitsUserSpaceOnUse) { - [painter setUserSpaceBoundingBox:[svg getContextBounds]]; + [painter setUserSpaceBoundingBox:[self.svgView getContextBounds]]; } - [svg definePainter:painter painterName:self.name]; + [self.svgView definePainter:painter painterName:self.name]; } @end diff --git a/ios/Elements/RNSVGUse.m b/ios/Elements/RNSVGUse.m index 075b4158..0a8c4e1d 100644 --- a/ios/Elements/RNSVGUse.m +++ b/ios/Elements/RNSVGUse.m @@ -24,7 +24,7 @@ - (void)renderLayerTo:(CGContextRef)context { - RNSVGNode* template = [[self getSvgView] getDefinedTemplate:self.href]; + RNSVGNode* template = [self.svgView getDefinedTemplate:self.href]; if (template) { [self beginTransparencyLayer:context]; [self clip:context]; diff --git a/ios/RNSVGNode.h b/ios/RNSVGNode.h index 07803745..7f4dbd4d 100644 --- a/ios/RNSVGNode.h +++ b/ios/RNSVGNode.h @@ -34,6 +34,11 @@ extern CGFloat const RNSVG_DEFAULT_FONT_SIZE; @property (nonatomic, assign) CGAffineTransform matrix; @property (nonatomic, assign) BOOL active; +/** + * RNSVGSvgView which ownes current RNSVGNode + */ +@property (nonatomic, readonly, weak) RNSVGSvgView *svgView; + - (void)invalidate; - (RNSVGGroup *)getTextRoot; @@ -73,11 +78,6 @@ extern CGFloat const RNSVG_DEFAULT_FONT_SIZE; */ - (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event withTransform:(CGAffineTransform)transfrom; -/** - * get RNSVGSvgView which ownes current RNSVGNode - */ -- (RNSVGSvgView *)getSvgView; - - (CGFloat)relativeOnWidth:(NSString *)length; - (CGFloat)relativeOnHeight:(NSString *)length; diff --git a/ios/RNSVGNode.m b/ios/RNSVGNode.m index e32dafcd..afffc460 100644 --- a/ios/RNSVGNode.m +++ b/ios/RNSVGNode.m @@ -12,13 +12,16 @@ #import "RNSVGGroup.h" #import "RNSVGGlyphContext.h" +@interface RNSVGNode() +@property (nonatomic, readwrite, weak) RNSVGSvgView *svgView; +@end + @implementation RNSVGNode { RNSVGGroup *_textRoot; RNSVGGlyphContext *glyphContext; BOOL _transparent; CGPathRef _cachedClipPath; - RNSVGSvgView *_svgView; } CGFloat const RNSVG_M_SQRT1_2l = 0.707106781186547524400844362104849039; @@ -173,7 +176,7 @@ CGFloat const RNSVG_DEFAULT_FONT_SIZE = 12; { if (self.clipPath) { CGPathRelease(_cachedClipPath); - _cachedClipPath = CGPathRetain([[[self getSvgView] getDefinedClipPath:self.clipPath] getPath:context]); + _cachedClipPath = CGPathRetain([[self.svgView getDefinedClipPath:self.clipPath] getPath:context]); } return [self getClipPath]; @@ -218,7 +221,7 @@ CGFloat const RNSVG_DEFAULT_FONT_SIZE = 12; return nil; } -- (RNSVGSvgView *)getSvgView +- (RNSVGSvgView *)svgView { if (_svgView) { return _svgView; @@ -229,8 +232,7 @@ CGFloat const RNSVG_DEFAULT_FONT_SIZE = 12; if ([parent class] == [RNSVGSvgView class]) { _svgView = parent; } else if ([parent isKindOfClass:[RNSVGNode class]]) { - RNSVGNode *node = parent; - _svgView = [node getSvgView]; + _svgView = ((RNSVGNode *)parent).svgView; } else { RCTLogError(@"RNSVG: %@ should be descendant of a SvgViewShadow.", NSStringFromClass(self.class)); } @@ -275,7 +277,7 @@ CGFloat const RNSVG_DEFAULT_FONT_SIZE = 12; RNSVGGroup * root = [self getTextRoot]; RNSVGGlyphContext * gc = [root getGlyphContext]; if (root == nil || gc == nil) { - return CGRectGetWidth([[self getSvgView] getContextBounds]); + return CGRectGetWidth([self.svgView getContextBounds]); } else { return [gc getWidth]; } @@ -286,7 +288,7 @@ CGFloat const RNSVG_DEFAULT_FONT_SIZE = 12; RNSVGGroup * root = [self getTextRoot]; RNSVGGlyphContext * gc = [root getGlyphContext]; if (root == nil || gc == nil) { - return CGRectGetHeight([[self getSvgView] getContextBounds]); + return CGRectGetHeight([self.svgView getContextBounds]); } else { return [gc getHeight]; } @@ -294,19 +296,19 @@ CGFloat const RNSVG_DEFAULT_FONT_SIZE = 12; - (CGFloat)getContextLeft { - return CGRectGetMinX([[self getSvgView] getContextBounds]); + return CGRectGetMinX([self.svgView getContextBounds]); } - (CGFloat)getContextTop { - return CGRectGetMinY([[self getSvgView] getContextBounds]); + return CGRectGetMinY([self.svgView getContextBounds]); } - (void)parseReference { if (self.name) { - RNSVGSvgView* svg = [self getSvgView]; - [svg defineTemplate:self templateName:self.name]; + typeof(self) __weak weakSelf = self; + [self.svgView defineTemplate:weakSelf templateName:self.name]; } } diff --git a/ios/RNSVGRenderable.m b/ios/RNSVGRenderable.m index f7c0e72b..5c1a30f2 100644 --- a/ios/RNSVGRenderable.m +++ b/ios/RNSVGRenderable.m @@ -202,7 +202,7 @@ CGContextClip(context); [self.fill paint:context opacity:self.fillOpacity - painter:[[self getSvgView] getDefinedPainter:self.fill.brushRef] + painter:[self.svgView getDefinedPainter:self.fill.brushRef] ]; CGContextRestoreGState(context); @@ -247,7 +247,7 @@ [self.stroke paint:context opacity:self.strokeOpacity - painter:[[self getSvgView] getDefinedPainter:self.stroke.brushRef] + painter:[self.svgView getDefinedPainter:self.stroke.brushRef] ]; return; } diff --git a/ios/Text/RNSVGTextPath.m b/ios/Text/RNSVGTextPath.m index 1bf7bbbc..e2236a91 100644 --- a/ios/Text/RNSVGTextPath.m +++ b/ios/Text/RNSVGTextPath.m @@ -114,8 +114,7 @@ void RNSVGPerformanceBezier_addLine(CGPoint *last, const CGPoint *next, NSMutabl - (void)getPathLength:(CGFloat*)lengthP lineCount:(NSUInteger*)lineCountP lengths:(NSArray* __strong *)lengthsP lines:(NSArray* __strong *)linesP isClosed:(BOOL*)isClosedP { - RNSVGSvgView *svg = [self getSvgView]; - RNSVGNode *template = [svg getDefinedTemplate:self.href]; + RNSVGNode *template = [self.svgView getDefinedTemplate:self.href]; CGPathRef path = [template getPath:nil]; if (_path != path) {