From db995423ba06737f3bf46fc32b1d1ece6eacd5b7 Mon Sep 17 00:00:00 2001 From: wwwcg Date: Wed, 24 Jan 2024 14:20:56 +0800 Subject: [PATCH] fix(ios): backgroundImage may not update in time when reusing hippyView (#3736) * chore(ios): revert rename Hippy prefix to NativeRender * fix(ios): backgroundImage may not update in time when reusing hippyView replace some deprecated UIGraphics functions * fix(ios): backgroundImage may not update in time when reusing hippyView2 --- .../component/view/HippyBorderDrawing.h | 24 ++-- .../component/view/HippyBorderDrawing.m | 106 +++++++++--------- .../ios/renderer/component/view/HippyView.h | 5 +- .../ios/renderer/component/view/HippyView.m | 87 +++++++------- .../component/view/HippyViewManager.mm | 25 +++-- .../component/view/NativeRenderTouchesView.h | 2 +- .../component/view/NativeRenderTouchesView.m | 16 +-- .../ios/utils/HippyConvert+NativeRender.h | 48 ++++---- .../ios/utils/HippyConvert+NativeRender.m | 50 ++++----- .../ios/utils/NativeRenderGradientObject.h | 4 +- .../ios/utils/NativeRenderGradientObject.m | 2 +- 11 files changed, 192 insertions(+), 177 deletions(-) diff --git a/renderer/native/ios/renderer/component/view/HippyBorderDrawing.h b/renderer/native/ios/renderer/component/view/HippyBorderDrawing.h index b5f88551ecd..0718cbbb1d7 100644 --- a/renderer/native/ios/renderer/component/view/HippyBorderDrawing.h +++ b/renderer/native/ios/renderer/component/view/HippyBorderDrawing.h @@ -30,40 +30,40 @@ typedef struct { CGFloat topRight; CGFloat bottomLeft; CGFloat bottomRight; -} NativeRenderCornerRadii; +} HippyCornerRadii; typedef struct { CGSize topLeft; CGSize topRight; CGSize bottomLeft; CGSize bottomRight; -} NativeRenderCornerInsets; +} HippyCornerInsets; typedef struct { CGColorRef top; CGColorRef left; CGColorRef bottom; CGColorRef right; -} NativeRenderBorderColors; +} HippyBorderColors; /** * Determine if the border widths, colors and radii are all equal. */ -HIPPY_EXTERN BOOL NativeRenderBorderInsetsAreEqual(UIEdgeInsets borderInsets); -HIPPY_EXTERN BOOL NativeRenderCornerRadiiAreEqual(NativeRenderCornerRadii cornerRadii); -HIPPY_EXTERN BOOL NativeRenderBorderColorsAreEqual(NativeRenderBorderColors borderColors); +HIPPY_EXTERN BOOL HippyBorderInsetsAreEqual(UIEdgeInsets borderInsets); +HIPPY_EXTERN BOOL HippyCornerRadiiAreEqual(HippyCornerRadii cornerRadii); +HIPPY_EXTERN BOOL HippyBorderColorsAreEqual(HippyBorderColors borderColors); /** - * Convert NativeRenderCornerRadii to NativeRenderCornerInsets by applying border insets. + * Convert HippyCornerRadii to HippyCornerInsets by applying border insets. * Effectively, returns radius - inset, with a lower bound of 0.0. */ -HIPPY_EXTERN NativeRenderCornerInsets NativeRenderGetCornerInsets(NativeRenderCornerRadii cornerRadii, UIEdgeInsets borderInsets); +HIPPY_EXTERN HippyCornerInsets HippyGetCornerInsets(HippyCornerRadii cornerRadii, UIEdgeInsets borderInsets); /** * Create a CGPath representing a rounded rectangle with the specified bounds * and corner insets. Note that the CGPathRef must be released by the caller. */ -HIPPY_EXTERN CGPathRef NativeRenderPathCreateWithRoundedRect(CGRect bounds, NativeRenderCornerInsets cornerInsets, const CGAffineTransform *transform); +HIPPY_EXTERN CGPathRef HippyPathCreateWithRoundedRect(CGRect bounds, HippyCornerInsets cornerInsets, const CGAffineTransform *transform); /** * Draw a CSS-compliant border as an image. You can determine if it's scalable @@ -71,7 +71,7 @@ HIPPY_EXTERN CGPathRef NativeRenderPathCreateWithRoundedRect(CGRect bounds, Nati * * `borderInsets` defines the border widths for each edge. */ -HIPPY_EXTERN UIImage *NativeRenderGetBorderImage(NativeRenderBorderStyle borderStyle, CGSize viewSize, NativeRenderCornerRadii cornerRadii, UIEdgeInsets borderInsets, - NativeRenderBorderColors borderColors, CGColorRef backgroundColor, BOOL drawToEdge, BOOL drawBackgroundColor); +HIPPY_EXTERN UIImage *HippyGetBorderImage(HippyBorderStyle borderStyle, CGSize viewSize, HippyCornerRadii cornerRadii, UIEdgeInsets borderInsets, + HippyBorderColors borderColors, CGColorRef backgroundColor, BOOL drawToEdge, BOOL drawBackgroundColor); -HIPPY_EXTERN CGPathRef NativeRenderPathCreateOuterOutline(BOOL drawToEdge, CGRect rect, NativeRenderCornerRadii cornerRadii); +HIPPY_EXTERN CGPathRef HippyPathCreateOuterOutline(BOOL drawToEdge, CGRect rect, HippyCornerRadii cornerRadii); diff --git a/renderer/native/ios/renderer/component/view/HippyBorderDrawing.m b/renderer/native/ios/renderer/component/view/HippyBorderDrawing.m index 2b7e78ad8d6..c21d1c1c4df 100644 --- a/renderer/native/ios/renderer/component/view/HippyBorderDrawing.m +++ b/renderer/native/ios/renderer/component/view/HippyBorderDrawing.m @@ -23,27 +23,27 @@ #import "HippyBorderDrawing.h" #import "HippyLog.h" -static const CGFloat NativeRenderViewBorderThreshold = 0.001; +static const CGFloat HippyViewBorderThreshold = 0.001; -BOOL NativeRenderBorderInsetsAreEqual(UIEdgeInsets borderInsets) { - return ABS(borderInsets.left - borderInsets.right) < NativeRenderViewBorderThreshold - && ABS(borderInsets.left - borderInsets.bottom) < NativeRenderViewBorderThreshold - && ABS(borderInsets.left - borderInsets.top) < NativeRenderViewBorderThreshold; +BOOL HippyBorderInsetsAreEqual(UIEdgeInsets borderInsets) { + return ABS(borderInsets.left - borderInsets.right) < HippyViewBorderThreshold + && ABS(borderInsets.left - borderInsets.bottom) < HippyViewBorderThreshold + && ABS(borderInsets.left - borderInsets.top) < HippyViewBorderThreshold; } -BOOL NativeRenderCornerRadiiAreEqual(NativeRenderCornerRadii cornerRadii) { - return ABS(cornerRadii.topLeft - cornerRadii.topRight) < NativeRenderViewBorderThreshold - && ABS(cornerRadii.topLeft - cornerRadii.bottomLeft) < NativeRenderViewBorderThreshold - && ABS(cornerRadii.topLeft - cornerRadii.bottomRight) < NativeRenderViewBorderThreshold; +BOOL HippyCornerRadiiAreEqual(HippyCornerRadii cornerRadii) { + return ABS(cornerRadii.topLeft - cornerRadii.topRight) < HippyViewBorderThreshold + && ABS(cornerRadii.topLeft - cornerRadii.bottomLeft) < HippyViewBorderThreshold + && ABS(cornerRadii.topLeft - cornerRadii.bottomRight) < HippyViewBorderThreshold; } -BOOL NativeRenderBorderColorsAreEqual(NativeRenderBorderColors borderColors) { +BOOL HippyBorderColorsAreEqual(HippyBorderColors borderColors) { return CGColorEqualToColor(borderColors.left, borderColors.right) && CGColorEqualToColor(borderColors.left, borderColors.top) && CGColorEqualToColor(borderColors.left, borderColors.bottom); } -NativeRenderCornerInsets NativeRenderGetCornerInsets(NativeRenderCornerRadii cornerRadii, UIEdgeInsets edgeInsets) { - return (NativeRenderCornerInsets) { { +HippyCornerInsets HippyGetCornerInsets(HippyCornerRadii cornerRadii, UIEdgeInsets edgeInsets) { + return (HippyCornerInsets) { { MAX(0, cornerRadii.topLeft - edgeInsets.left), MAX(0, cornerRadii.topLeft - edgeInsets.top), }, @@ -61,7 +61,7 @@ NativeRenderCornerInsets NativeRenderGetCornerInsets(NativeRenderCornerRadii cor } }; } -static void NativeRenderPathAddEllipticArc( +static void HippyPathAddEllipticArc( CGMutablePathRef path, const CGAffineTransform *m, CGPoint origin, CGSize size, CGFloat startAngle, CGFloat endAngle, BOOL clockwise) { CGFloat xScale = 1, yScale = 1, radius = 0; if (size.width != 0) { @@ -83,7 +83,7 @@ static void NativeRenderPathAddEllipticArc( CGPathAddArc(path, &t, 0, 0, radius, startAngle, endAngle, clockwise); } -CGPathRef NativeRenderPathCreateWithRoundedRect(CGRect bounds, NativeRenderCornerInsets cornerInsets, const CGAffineTransform *transform) { +CGPathRef HippyPathCreateWithRoundedRect(CGRect bounds, HippyCornerInsets cornerInsets, const CGAffineTransform *transform) { const CGFloat minX = CGRectGetMinX(bounds); const CGFloat minY = CGRectGetMinY(bounds); const CGFloat maxX = CGRectGetMaxX(bounds); @@ -107,15 +107,15 @@ CGPathRef NativeRenderPathCreateWithRoundedRect(CGRect bounds, NativeRenderCorne }; CGMutablePathRef path = CGPathCreateMutable(); - NativeRenderPathAddEllipticArc(path, transform, (CGPoint) { minX + topLeft.width, minY + topLeft.height }, topLeft, M_PI, 3 * M_PI_2, NO); - NativeRenderPathAddEllipticArc(path, transform, (CGPoint) { maxX - topRight.width, minY + topRight.height }, topRight, 3 * M_PI_2, 0, NO); - NativeRenderPathAddEllipticArc(path, transform, (CGPoint) { maxX - bottomRight.width, maxY - bottomRight.height }, bottomRight, 0, M_PI_2, NO); - NativeRenderPathAddEllipticArc(path, transform, (CGPoint) { minX + bottomLeft.width, maxY - bottomLeft.height }, bottomLeft, M_PI_2, M_PI, NO); + HippyPathAddEllipticArc(path, transform, (CGPoint) { minX + topLeft.width, minY + topLeft.height }, topLeft, M_PI, 3 * M_PI_2, NO); + HippyPathAddEllipticArc(path, transform, (CGPoint) { maxX - topRight.width, minY + topRight.height }, topRight, 3 * M_PI_2, 0, NO); + HippyPathAddEllipticArc(path, transform, (CGPoint) { maxX - bottomRight.width, maxY - bottomRight.height }, bottomRight, 0, M_PI_2, NO); + HippyPathAddEllipticArc(path, transform, (CGPoint) { minX + bottomLeft.width, maxY - bottomLeft.height }, bottomLeft, M_PI_2, M_PI, NO); CGPathCloseSubpath(path); return path; } -static void NativeRenderEllipseGetIntersectionsWithLine(CGRect ellipseBounds, CGPoint lineStart, CGPoint lineEnd, CGPoint intersections[2]) { +static void HippyEllipseGetIntersectionsWithLine(CGRect ellipseBounds, CGPoint lineStart, CGPoint lineEnd, CGPoint intersections[2]) { const CGPoint ellipseCenter = { CGRectGetMidX(ellipseBounds), CGRectGetMidY(ellipseBounds) }; lineStart.x -= ellipseCenter.x; @@ -141,30 +141,30 @@ static void NativeRenderEllipseGetIntersectionsWithLine(CGRect ellipseBounds, CG intersections[1] = (CGPoint) { x2 + ellipseCenter.x, y2 + ellipseCenter.y }; } -NS_INLINE BOOL NativeRenderCornerRadiiAreAboveThreshold(NativeRenderCornerRadii cornerRadii) { - return (cornerRadii.topLeft > NativeRenderViewBorderThreshold || cornerRadii.topRight > NativeRenderViewBorderThreshold - || cornerRadii.bottomLeft > NativeRenderViewBorderThreshold || cornerRadii.bottomRight > NativeRenderViewBorderThreshold); +NS_INLINE BOOL HippyCornerRadiiAreAboveThreshold(HippyCornerRadii cornerRadii) { + return (cornerRadii.topLeft > HippyViewBorderThreshold || cornerRadii.topRight > HippyViewBorderThreshold + || cornerRadii.bottomLeft > HippyViewBorderThreshold || cornerRadii.bottomRight > HippyViewBorderThreshold); } -CGPathRef NativeRenderPathCreateOuterOutline(BOOL drawToEdge, CGRect rect, NativeRenderCornerRadii cornerRadii) { +CGPathRef HippyPathCreateOuterOutline(BOOL drawToEdge, CGRect rect, HippyCornerRadii cornerRadii) { if (drawToEdge) { return CGPathCreateWithRect(rect, NULL); } - return NativeRenderPathCreateWithRoundedRect(rect, NativeRenderGetCornerInsets(cornerRadii, UIEdgeInsetsZero), NULL); + return HippyPathCreateWithRoundedRect(rect, HippyGetCornerInsets(cornerRadii, UIEdgeInsetsZero), NULL); } -static CGContextRef NativeRenderUIGraphicsBeginImageContext(CGSize size, CGColorRef backgroundColor, BOOL hasCornerRadii, BOOL drawToEdge) { +static CGContextRef HippyUIGraphicsBeginImageContext(CGSize size, CGColorRef backgroundColor, BOOL hasCornerRadii, BOOL drawToEdge) { const CGFloat alpha = CGColorGetAlpha(backgroundColor); const BOOL opaque = (drawToEdge || !hasCornerRadii) && alpha == 1.0; UIGraphicsBeginImageContextWithOptions(size, opaque, 0.0); return UIGraphicsGetCurrentContext(); } -static UIImage *NativeRenderGetSolidBorderImage(NativeRenderCornerRadii cornerRadii, CGSize viewSize, UIEdgeInsets borderInsets, NativeRenderBorderColors borderColors, +static UIImage *HippyGetSolidBorderImage(HippyCornerRadii cornerRadii, CGSize viewSize, UIEdgeInsets borderInsets, HippyBorderColors borderColors, CGColorRef backgroundColor, BOOL drawToEdge, BOOL drawBackgrondColor) { - const BOOL hasCornerRadii = NativeRenderCornerRadiiAreAboveThreshold(cornerRadii); - const NativeRenderCornerInsets cornerInsets = NativeRenderGetCornerInsets(cornerRadii, borderInsets); + const BOOL hasCornerRadii = HippyCornerRadiiAreAboveThreshold(cornerRadii); + const HippyCornerInsets cornerInsets = HippyGetCornerInsets(cornerRadii, borderInsets); const BOOL makeStretchable = (borderInsets.left + cornerInsets.topLeft.width + borderInsets.right + cornerInsets.bottomRight.width <= viewSize.width) @@ -183,9 +183,9 @@ static CGContextRef NativeRenderUIGraphicsBeginImageContext(CGSize size, CGColor edgeInsets.top + 1 + edgeInsets.bottom } : viewSize; - CGContextRef ctx = NativeRenderUIGraphicsBeginImageContext(size, backgroundColor, hasCornerRadii, drawToEdge); + CGContextRef ctx = HippyUIGraphicsBeginImageContext(size, backgroundColor, hasCornerRadii, drawToEdge); const CGRect rect = { .size = size }; - CGPathRef path = NativeRenderPathCreateOuterOutline(drawToEdge, rect, cornerRadii); + CGPathRef path = HippyPathCreateOuterOutline(drawToEdge, rect, cornerRadii); if (backgroundColor) { if (!drawBackgrondColor) { @@ -199,12 +199,12 @@ static CGContextRef NativeRenderUIGraphicsBeginImageContext(CGSize size, CGColor CGContextAddPath(ctx, path); CGPathRelease(path); - CGPathRef insetPath = NativeRenderPathCreateWithRoundedRect(UIEdgeInsetsInsetRect(rect, borderInsets), cornerInsets, NULL); + CGPathRef insetPath = HippyPathCreateWithRoundedRect(UIEdgeInsetsInsetRect(rect, borderInsets), cornerInsets, NULL); CGContextAddPath(ctx, insetPath); CGContextEOClip(ctx); - BOOL hasEqualColors = NativeRenderBorderColorsAreEqual(borderColors); + BOOL hasEqualColors = HippyBorderColorsAreEqual(borderColors); if ((drawToEdge || !hasCornerRadii) && hasEqualColors) { CGContextSetFillColorWithColor(ctx, borderColors.left); CGContextAddRect(ctx, rect); @@ -215,7 +215,7 @@ static CGContextRef NativeRenderUIGraphicsBeginImageContext(CGSize size, CGColor CGPoint topLeft = (CGPoint) { borderInsets.left, borderInsets.top }; if (cornerInsets.topLeft.width > 0 && cornerInsets.topLeft.height > 0) { CGPoint points[2]; - NativeRenderEllipseGetIntersectionsWithLine( + HippyEllipseGetIntersectionsWithLine( (CGRect) { topLeft, { 2 * cornerInsets.topLeft.width, 2 * cornerInsets.topLeft.height } }, CGPointZero, topLeft, points); if (!isnan(points[1].x) && !isnan(points[1].y)) { topLeft = points[1]; @@ -225,7 +225,7 @@ static CGContextRef NativeRenderUIGraphicsBeginImageContext(CGSize size, CGColor CGPoint bottomLeft = (CGPoint) { borderInsets.left, size.height - borderInsets.bottom }; if (cornerInsets.bottomLeft.width > 0 && cornerInsets.bottomLeft.height > 0) { CGPoint points[2]; - NativeRenderEllipseGetIntersectionsWithLine((CGRect) { { bottomLeft.x, bottomLeft.y - 2 * cornerInsets.bottomLeft.height }, + HippyEllipseGetIntersectionsWithLine((CGRect) { { bottomLeft.x, bottomLeft.y - 2 * cornerInsets.bottomLeft.height }, { 2 * cornerInsets.bottomLeft.width, 2 * cornerInsets.bottomLeft.height } }, (CGPoint) { 0, size.height }, bottomLeft, points); if (!isnan(points[1].x) && !isnan(points[1].y)) { @@ -236,7 +236,7 @@ static CGContextRef NativeRenderUIGraphicsBeginImageContext(CGSize size, CGColor CGPoint topRight = (CGPoint) { size.width - borderInsets.right, borderInsets.top }; if (cornerInsets.topRight.width > 0 && cornerInsets.topRight.height > 0) { CGPoint points[2]; - NativeRenderEllipseGetIntersectionsWithLine((CGRect) { { topRight.x - 2 * cornerInsets.topRight.width, topRight.y }, + HippyEllipseGetIntersectionsWithLine((CGRect) { { topRight.x - 2 * cornerInsets.topRight.width, topRight.y }, { 2 * cornerInsets.topRight.width, 2 * cornerInsets.topRight.height } }, (CGPoint) { size.width, 0 }, topRight, points); if (!isnan(points[0].x) && !isnan(points[0].y)) { @@ -247,7 +247,7 @@ static CGContextRef NativeRenderUIGraphicsBeginImageContext(CGSize size, CGColor CGPoint bottomRight = (CGPoint) { size.width - borderInsets.right, size.height - borderInsets.bottom }; if (cornerInsets.bottomRight.width > 0 && cornerInsets.bottomRight.height > 0) { CGPoint points[2]; - NativeRenderEllipseGetIntersectionsWithLine( + HippyEllipseGetIntersectionsWithLine( (CGRect) { { bottomRight.x - 2 * cornerInsets.bottomRight.width, bottomRight.y - 2 * cornerInsets.bottomRight.height }, { 2 * cornerInsets.bottomRight.width, 2 * cornerInsets.bottomRight.height } }, (CGPoint) { size.width, size.height }, bottomRight, points); @@ -398,11 +398,11 @@ static CGContextRef NativeRenderUIGraphicsBeginImageContext(CGSize size, CGColor // of gradients _along_ a path (NB: clipping a path and drawing a linear gradient // is _not_ equivalent). -static UIImage *NativeRenderGetDashedOrDottedBorderImage(NativeRenderBorderStyle borderStyle, NativeRenderCornerRadii cornerRadii, CGSize viewSize, - UIEdgeInsets borderInsets, NativeRenderBorderColors borderColors, CGColorRef backgroundColor, BOOL drawToEdge, BOOL drawBackgrondColor) { - NSCParameterAssert(borderStyle == NativeRenderBorderStyleDashed || borderStyle == NativeRenderBorderStyleDotted); +static UIImage *HippyGetDashedOrDottedBorderImage(HippyBorderStyle borderStyle, HippyCornerRadii cornerRadii, CGSize viewSize, + UIEdgeInsets borderInsets, HippyBorderColors borderColors, CGColorRef backgroundColor, BOOL drawToEdge, BOOL drawBackgrondColor) { + NSCParameterAssert(borderStyle == HippyBorderStyleDashed || borderStyle == HippyBorderStyleDotted); - if (!NativeRenderBorderColorsAreEqual(borderColors) || !NativeRenderBorderInsetsAreEqual(borderInsets)) { + if (!HippyBorderColorsAreEqual(borderColors) || !HippyBorderInsetsAreEqual(borderInsets)) { HippyLogWarn(@"Unsupported dashed / dotted border style"); return nil; } @@ -412,12 +412,12 @@ static CGContextRef NativeRenderUIGraphicsBeginImageContext(CGSize size, CGColor return nil; } - const BOOL hasCornerRadii = NativeRenderCornerRadiiAreAboveThreshold(cornerRadii); - CGContextRef ctx = NativeRenderUIGraphicsBeginImageContext(viewSize, backgroundColor, hasCornerRadii, drawToEdge); + const BOOL hasCornerRadii = HippyCornerRadiiAreAboveThreshold(cornerRadii); + CGContextRef ctx = HippyUIGraphicsBeginImageContext(viewSize, backgroundColor, hasCornerRadii, drawToEdge); const CGRect rect = { .size = viewSize }; if (backgroundColor) { - CGPathRef outerPath = NativeRenderPathCreateOuterOutline(drawToEdge, rect, cornerRadii); + CGPathRef outerPath = HippyPathCreateOuterOutline(drawToEdge, rect, cornerRadii); CGContextAddPath(ctx, outerPath); CGPathRelease(outerPath); if (!drawBackgrondColor) { @@ -431,10 +431,10 @@ static CGContextRef NativeRenderUIGraphicsBeginImageContext(CGSize size, CGColor // perpendicular to the path, that's why we inset by half the width, so that it // reaches the edge of the rect. CGRect pathRect = CGRectInset(rect, lineWidth / 2.0, lineWidth / 2.0); - CGPathRef path = NativeRenderPathCreateWithRoundedRect(pathRect, NativeRenderGetCornerInsets(cornerRadii, UIEdgeInsetsZero), NULL); + CGPathRef path = HippyPathCreateWithRoundedRect(pathRect, HippyGetCornerInsets(cornerRadii, UIEdgeInsetsZero), NULL); CGFloat dashLengths[2]; - dashLengths[0] = dashLengths[1] = (borderStyle == NativeRenderBorderStyleDashed ? 3 : 1) * lineWidth; + dashLengths[0] = dashLengths[1] = (borderStyle == HippyBorderStyleDashed ? 3 : 1) * lineWidth; CGContextSetLineWidth(ctx, lineWidth); CGContextSetLineDash(ctx, 0, dashLengths, sizeof(dashLengths) / sizeof(*dashLengths)); @@ -453,15 +453,15 @@ static CGContextRef NativeRenderUIGraphicsBeginImageContext(CGSize size, CGColor return image; } -UIImage *NativeRenderGetBorderImage(NativeRenderBorderStyle borderStyle, CGSize viewSize, NativeRenderCornerRadii cornerRadii, UIEdgeInsets borderInsets, - NativeRenderBorderColors borderColors, CGColorRef backgroundColor, BOOL drawToEdge, BOOL drawBackgrondColor) { +UIImage *HippyGetBorderImage(HippyBorderStyle borderStyle, CGSize viewSize, HippyCornerRadii cornerRadii, UIEdgeInsets borderInsets, + HippyBorderColors borderColors, CGColorRef backgroundColor, BOOL drawToEdge, BOOL drawBackgrondColor) { switch (borderStyle) { - case NativeRenderBorderStyleSolid: - return NativeRenderGetSolidBorderImage(cornerRadii, viewSize, borderInsets, borderColors, backgroundColor, drawToEdge, drawBackgrondColor); - case NativeRenderBorderStyleDashed: - case NativeRenderBorderStyleDotted: - return NativeRenderGetDashedOrDottedBorderImage(borderStyle, cornerRadii, viewSize, borderInsets, borderColors, backgroundColor, drawToEdge, drawBackgrondColor); - case NativeRenderBorderStyleNone: + case HippyBorderStyleSolid: + return HippyGetSolidBorderImage(cornerRadii, viewSize, borderInsets, borderColors, backgroundColor, drawToEdge, drawBackgrondColor); + case HippyBorderStyleDashed: + case HippyBorderStyleDotted: + return HippyGetDashedOrDottedBorderImage(borderStyle, cornerRadii, viewSize, borderInsets, borderColors, backgroundColor, drawToEdge, drawBackgrondColor); + case HippyBorderStyleNone: break; } diff --git a/renderer/native/ios/renderer/component/view/HippyView.h b/renderer/native/ios/renderer/component/view/HippyView.h index 495f0860582..d388230eed5 100644 --- a/renderer/native/ios/renderer/component/view/HippyView.h +++ b/renderer/native/ios/renderer/component/view/HippyView.h @@ -81,12 +81,13 @@ /** * Border styles. */ -@property (nonatomic, assign) NativeRenderBorderStyle borderStyle; +@property (nonatomic, assign) HippyBorderStyle borderStyle; /** * BackgroundImage styles. */ -@property(nonatomic, strong) UIImage *backgroundImage; +@property (nonatomic, strong) UIImage *backgroundImage; +@property (nonatomic, assign) NSUInteger backgroundImageUrlHashValue; @property (nonatomic, strong) NSString *backgroundSize; @property (nonatomic, assign) CGFloat backgroundPositionX; @property (nonatomic, assign) CGFloat backgroundPositionY; diff --git a/renderer/native/ios/renderer/component/view/HippyView.m b/renderer/native/ios/renderer/component/view/HippyView.m index f223f9ae1c8..fb3c93b1d2e 100644 --- a/renderer/native/ios/renderer/component/view/HippyView.m +++ b/renderer/native/ios/renderer/component/view/HippyView.m @@ -122,8 +122,10 @@ - (void)setBackgroundColor:(UIColor *)backgroundColor { } - (void)setBackgroundImage:(UIImage *)backgroundImage { - _backgroundImage = backgroundImage; - [self.layer setNeedsDisplay]; + if (_backgroundImage != backgroundImage) { + _backgroundImage = backgroundImage; + [self.layer setNeedsDisplay]; + } } - (UIEdgeInsets)bordersAsInsets { @@ -137,7 +139,7 @@ - (UIEdgeInsets)bordersAsInsets { }; } -- (NativeRenderCornerRadii)cornerRadii { +- (HippyCornerRadii)cornerRadii { // Get corner radii const CGFloat radius = MAX(0, _borderRadius); const CGFloat topLeftRadius = _borderTopLeftRadius >= 0 ? _borderTopLeftRadius : radius; @@ -153,7 +155,7 @@ - (NativeRenderCornerRadii)cornerRadii { const CGFloat leftScaleFactor = HippyZeroIfNaN(MIN(1, size.height / (topLeftRadius + bottomLeftRadius))); // Return scaled radii - return (NativeRenderCornerRadii) { + return (HippyCornerRadii) { topLeftRadius * MIN(topScaleFactor, leftScaleFactor), topRightRadius * MIN(topScaleFactor, rightScaleFactor), bottomLeftRadius * MIN(bottomScaleFactor, leftScaleFactor), @@ -176,8 +178,8 @@ - (void)setFrame:(CGRect)frame { [super setFrame:frame]; } -- (NativeRenderBorderColors)borderColors { - return (NativeRenderBorderColors) { +- (HippyBorderColors)borderColors { + return (HippyBorderColors) { _borderTopColor ?: _borderColor, _borderLeftColor ?: _borderColor, _borderBottomColor ?: _borderColor, @@ -185,7 +187,7 @@ - (NativeRenderBorderColors)borderColors { }; } -void NativeRenderBoarderColorsRetain(NativeRenderBorderColors c) { +void NativeRenderBoarderColorsRetain(HippyBorderColors c) { if (c.top) { CGColorRetain(c.top); } @@ -200,7 +202,7 @@ void NativeRenderBoarderColorsRetain(NativeRenderBorderColors c) { } } -void NativeRenderBoarderColorsRelease(NativeRenderBorderColors c) { +void NativeRenderBoarderColorsRelease(HippyBorderColors c) { if (c.top) { CGColorRelease(c.top); } @@ -239,16 +241,19 @@ - (void)displayLayer:(CALayer *)layer { [self drawShadowForLayer]; - const NativeRenderCornerRadii cornerRadii = [self cornerRadii]; + const HippyCornerRadii cornerRadii = [self cornerRadii]; const UIEdgeInsets borderInsets = [self bordersAsInsets]; - const NativeRenderBorderColors borderColors = [self borderColors]; + const HippyBorderColors borderColors = [self borderColors]; UIColor *backgroundColor = self.backgroundColor; BOOL isRunningInTest = HippyRunningInTestEnvironment(); - BOOL isCornerEqual = NativeRenderCornerRadiiAreEqual(cornerRadii); - BOOL isBorderInsetsEqual = NativeRenderBorderInsetsAreEqual(borderInsets); - BOOL isBorderColorsEqual = NativeRenderBorderColorsAreEqual(borderColors); - BOOL borderStyle = (_borderStyle == NativeRenderBorderStyleSolid || _borderStyle == NativeRenderBorderStyleNone); + BOOL isCornerEqual = HippyCornerRadiiAreEqual(cornerRadii); + BOOL isBorderInsetsEqual = HippyBorderInsetsAreEqual(borderInsets); + BOOL isBorderColorsEqual = HippyBorderColorsAreEqual(borderColors); + BOOL borderStyle = (_borderStyle == HippyBorderStyleSolid || _borderStyle == HippyBorderStyleNone); + // iOS draws borders in front of the content whereas CSS draws them behind + // the content. For this reason, only use iOS border drawing when clipping + // or when the border is hidden. BOOL borderColorCheck = (borderInsets.top == 0 || (borderColors.top && CGColorGetAlpha(borderColors.top) == 0) || self.clipsToBounds); BOOL useIOSBorderRendering = !isRunningInTest && isCornerEqual && isBorderInsetsEqual && isBorderColorsEqual && borderStyle && borderColorCheck; @@ -312,9 +317,9 @@ - (void)displayLayer:(CALayer *)layer { } - (BOOL)getLayerContentForColor:(UIColor *)color completionBlock:(void (^)(UIImage *))contentBlock { - const NativeRenderCornerRadii cornerRadii = [self cornerRadii]; + const HippyCornerRadii cornerRadii = [self cornerRadii]; const UIEdgeInsets borderInsets = [self bordersAsInsets]; - const NativeRenderBorderColors borderColors = [self borderColors]; + const HippyBorderColors borderColors = [self borderColors]; UIColor *backgroundColor = color?:self.backgroundColor; CGRect theFrame = self.frame; @@ -328,7 +333,7 @@ - (BOOL)getLayerContentForColor:(UIColor *)color completionBlock:(void (^)(UIIma } NSInteger clipToBounds = self.clipsToBounds; NSString *backgroundSize = self.backgroundSize; - UIImage *borderImage = NativeRenderGetBorderImage(self.borderStyle, theFrame.size, cornerRadii, borderInsets, + UIImage *borderImage = HippyGetBorderImage(self.borderStyle, theFrame.size, cornerRadii, borderInsets, borderColors, backgroundColor.CGColor, clipToBounds, !self.gradientObject); if (!self.backgroundImage && !self.gradientObject) { contentBlock(borderImage); @@ -338,27 +343,27 @@ - (BOOL)getLayerContentForColor:(UIColor *)color completionBlock:(void (^)(UIIma UIImage *decodedImage = self.backgroundImage; CGFloat backgroundPositionX = self.backgroundPositionX; CGFloat backgroundPositionY = self.backgroundPositionY; - UIGraphicsBeginImageContextWithOptions(theFrame.size, NO, 0); - //draw background image - CGSize imageSize = decodedImage.size; - CGSize targetSize = UIEdgeInsetsInsetRect(theFrame, [self bordersAsInsets]).size; - CGSize drawSize = makeSizeConstrainWithType(imageSize, targetSize, backgroundSize); - CGPoint originOffset = CGPointMake((targetSize.width - drawSize.width) / 2.0, - (targetSize.height - drawSize.height) / 2.0); - [decodedImage drawInRect:CGRectMake(borderInsets.left + backgroundPositionX + originOffset.x, - borderInsets.top + backgroundPositionY + originOffset.y, - drawSize.width, - drawSize.height)]; - //draw border - if (borderImage) { - CGSize size = theFrame.size; - [borderImage drawInRect:(CGRect) { CGPointZero, size }]; - } - //output image - UIImage *resultingImage = UIGraphicsGetImageFromCurrentImageContext(); - UIGraphicsEndImageContext(); - contentBlock(resultingImage); + UIGraphicsImageRendererFormat *rendererFormat = [UIGraphicsImageRendererFormat preferredFormat]; + rendererFormat.scale = borderImage.scale; + UIGraphicsImageRenderer *imageRenderer = [[UIGraphicsImageRenderer alloc] initWithSize:theFrame.size format:rendererFormat]; + UIImage *renderedImage = [imageRenderer imageWithActions:^(UIGraphicsImageRendererContext * _Nonnull rendererContext) { + // draw background image + CGSize imageSize = decodedImage.size; + CGSize targetSize = UIEdgeInsetsInsetRect(theFrame, borderInsets).size; + CGSize drawSize = makeSizeConstrainWithType(imageSize, targetSize, backgroundSize); + CGPoint originOffset = CGPointMake((targetSize.width - drawSize.width) / 2.0, (targetSize.height - drawSize.height) / 2.0); + [decodedImage drawInRect:CGRectMake(borderInsets.left + backgroundPositionX + originOffset.x, + borderInsets.top + backgroundPositionY + originOffset.y, + drawSize.width, + drawSize.height)]; + // draw border + if (borderImage) { + CGSize size = theFrame.size; + [borderImage drawInRect:(CGRect) { CGPointZero, size }]; + } + }]; + contentBlock(renderedImage); } else if (self.gradientObject) { CGSize size = theFrame.size; @@ -395,13 +400,13 @@ - (void)updateClippingForLayer:(CALayer *)layer { CGFloat cornerRadius = 0; if (self.clipsToBounds) { - const NativeRenderCornerRadii cornerRadii = [self cornerRadii]; - if (NativeRenderCornerRadiiAreEqual(cornerRadii)) { + const HippyCornerRadii cornerRadii = [self cornerRadii]; + if (HippyCornerRadiiAreEqual(cornerRadii)) { cornerRadius = cornerRadii.topLeft; } else { CAShapeLayer *shapeLayer = [CAShapeLayer layer]; - CGPathRef path = NativeRenderPathCreateWithRoundedRect(self.bounds, NativeRenderGetCornerInsets(cornerRadii, UIEdgeInsetsZero), NULL); + CGPathRef path = HippyPathCreateWithRoundedRect(self.bounds, HippyGetCornerInsets(cornerRadii, UIEdgeInsetsZero), NULL); shapeLayer.path = path; CGPathRelease(path); mask = shapeLayer; @@ -467,7 +472,7 @@ -(void)setBorder##side##Radius : (CGFloat)radius { \ #pragma mark - Border Style #define setBorderStyle(side) \ - -(void)setBorder##side##Style : (NativeRenderBorderStyle)style { \ + -(void)setBorder##side##Style : (HippyBorderStyle)style { \ if (_border##side##Style == style) { \ return; \ } \ diff --git a/renderer/native/ios/renderer/component/view/HippyViewManager.mm b/renderer/native/ios/renderer/component/view/HippyViewManager.mm index 27ea9a88c91..0caef284acb 100644 --- a/renderer/native/ios/renderer/component/view/HippyViewManager.mm +++ b/renderer/native/ios/renderer/component/view/HippyViewManager.mm @@ -224,9 +224,18 @@ - (void)measureInAppWindow:(NSNumber *)componentTag HIPPY_CUSTOM_VIEW_PROPERTY(backgroundImage, NSString, HippyView) { if (json) { NSString *imagePath = [HippyConvert NSString:json]; + // Old background image need to be cleaned up in time due to view's reuse + NSUInteger oldHash = view.backgroundImageUrlHashValue; + if (oldHash != imagePath.hash) { + if (oldHash > 0) { + view.backgroundImage = nil; + } + view.backgroundImageUrlHashValue = imagePath.hash; + } [self loadImageSource:imagePath forView:view]; } else { - view.backgroundImage = nil; + view.backgroundImageUrlHashValue = 0; + view.backgroundImage = defaultView.backgroundImage; } } @@ -372,9 +381,9 @@ - (void)loadImageSource:(NSString *)path forView:(HippyView *)view { view.layer.transform = json ? [HippyConvert CATransform3D:json] : defaultView.layer.transform; view.layer.allowsEdgeAntialiasing = !CATransform3DIsIdentity(view.layer.transform); } -HIPPY_CUSTOM_VIEW_PROPERTY(pointerEvents, NativeRenderPointerEvents, HippyView) { +HIPPY_CUSTOM_VIEW_PROPERTY(pointerEvents, HippyPointerEvents, HippyView) { if ([view respondsToSelector:@selector(setPointerEvents:)]) { - view.pointerEvents = json ? [HippyConvert NativeRenderPointerEvents:json] : defaultView.pointerEvents; + view.pointerEvents = json ? [HippyConvert HippyPointerEvents:json] : defaultView.pointerEvents; return; } @@ -383,8 +392,8 @@ - (void)loadImageSource:(NSString *)path forView:(HippyView *)view { return; } - switch ([HippyConvert NativeRenderPointerEvents:json]) { - case NativeRenderPointerEventsUnspecified: + switch ([HippyConvert HippyPointerEvents:json]) { + case HippyPointerEventsUnspecified: // Pointer events "unspecified" acts as if a stylesheet had not specified, // which is different than "auto" in CSS (which cannot and will not be // supported in `Hippy`. "auto" may override a parent's "none". @@ -392,7 +401,7 @@ - (void)loadImageSource:(NSString *)path forView:(HippyView *)view { // This wouldn't override a container view's `userInteractionEnabled = NO` view.userInteractionEnabled = YES; break; - case NativeRenderPointerEventsNone: + case HippyPointerEventsNone: view.userInteractionEnabled = NO; break; default: @@ -434,9 +443,9 @@ - (void)loadImageSource:(NSString *)path forView:(HippyView *)view { view.layer.borderWidth = json ? [HippyConvert CGFloat:json] : defaultView.layer.borderWidth; } } -HIPPY_CUSTOM_VIEW_PROPERTY(borderStyle, NativeRenderBorderStyle, HippyView) { +HIPPY_CUSTOM_VIEW_PROPERTY(borderStyle, HippyBorderStyle, HippyView) { if ([view respondsToSelector:@selector(setBorderStyle:)]) { - view.borderStyle = json ? [HippyConvert NativeRenderBorderStyle:json] : defaultView.borderStyle; + view.borderStyle = json ? [HippyConvert HippyBorderStyle:json] : defaultView.borderStyle; } } diff --git a/renderer/native/ios/renderer/component/view/NativeRenderTouchesView.h b/renderer/native/ios/renderer/component/view/NativeRenderTouchesView.h index e4789546b2e..0dd57bb3f08 100644 --- a/renderer/native/ios/renderer/component/view/NativeRenderTouchesView.h +++ b/renderer/native/ios/renderer/component/view/NativeRenderTouchesView.h @@ -37,7 +37,7 @@ NS_ASSUME_NONNULL_BEGIN /** * Used to control how touch events are processed. */ -@property (nonatomic, assign) NativeRenderPointerEvents pointerEvents; +@property (nonatomic, assign) HippyPointerEvents pointerEvents; @end diff --git a/renderer/native/ios/renderer/component/view/NativeRenderTouchesView.m b/renderer/native/ios/renderer/component/view/NativeRenderTouchesView.m index 303c2f9d94c..c7b9f5ab445 100644 --- a/renderer/native/ios/renderer/component/view/NativeRenderTouchesView.m +++ b/renderer/native/ios/renderer/component/view/NativeRenderTouchesView.m @@ -41,10 +41,10 @@ - (void)didMoveToSuperview { } -- (void)setPointerEvents:(NativeRenderPointerEvents)pointerEvents { +- (void)setPointerEvents:(HippyPointerEvents)pointerEvents { _pointerEvents = pointerEvents; - self.userInteractionEnabled = (pointerEvents != NativeRenderPointerEventsNone); - if (pointerEvents == NativeRenderPointerEventsBoxNone) { + self.userInteractionEnabled = (pointerEvents != HippyPointerEventsNone); + if (pointerEvents == HippyPointerEventsBoxNone) { self.accessibilityViewIsModal = NO; } } @@ -59,7 +59,7 @@ - (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event { // be outside the bounds of `view` (e.g., if -clipsToBounds is NO). UIView *hitSubview = nil; BOOL isPointInside = [self pointInside:point withEvent:event]; - BOOL needsHitSubview = !(_pointerEvents == NativeRenderPointerEventsNone || _pointerEvents == NativeRenderPointerEventsBoxOnly); + BOOL needsHitSubview = !(_pointerEvents == HippyPointerEventsNone || _pointerEvents == HippyPointerEventsBoxOnly); if (needsHitSubview && (![self clipsToBounds] || isPointInside)) { // The default behaviour of UIKit is that if a view does not contain a point, // then no subviews will be returned from hit testing, even if they contain @@ -79,13 +79,13 @@ - (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event { UIView *hitView = (isPointInside ? self : nil); switch (_pointerEvents) { - case NativeRenderPointerEventsNone: + case HippyPointerEventsNone: return nil; - case NativeRenderPointerEventsUnspecified: + case HippyPointerEventsUnspecified: return hitSubview ?: hitView; - case NativeRenderPointerEventsBoxOnly: + case HippyPointerEventsBoxOnly: return hitView; - case NativeRenderPointerEventsBoxNone: + case HippyPointerEventsBoxNone: return hitSubview; default: HippyLogError(@"Invalid pointer-events specified %ld on %@", (long)_pointerEvents, self); diff --git a/renderer/native/ios/utils/HippyConvert+NativeRender.h b/renderer/native/ios/utils/HippyConvert+NativeRender.h index a8ba560adcf..68bb74e96df 100644 --- a/renderer/native/ios/utils/HippyConvert+NativeRender.h +++ b/renderer/native/ios/utils/HippyConvert+NativeRender.h @@ -32,44 +32,44 @@ NS_ASSUME_NONNULL_BEGIN @end -typedef NS_ENUM(NSInteger, NativeRenderAnimationType) { - NativeRenderAnimationTypeSpring = 0, - NativeRenderAnimationTypeLinear, - NativeRenderAnimationTypeEaseIn, - NativeRenderAnimationTypeEaseOut, - NativeRenderAnimationTypeEaseInEaseOut, - NativeRenderAnimationTypeKeyboard, +typedef NS_ENUM(NSInteger, HippyAnimationType) { + HippyAnimationTypeSpring = 0, + HippyAnimationTypeLinear, + HippyAnimationTypeEaseIn, + HippyAnimationTypeEaseOut, + HippyAnimationTypeEaseInEaseOut, + HippyAnimationTypeKeyboard, }; -@interface HippyConvert (NativeRenderAnimationType) +@interface HippyConvert (HippyAnimationType) -+ (NativeRenderAnimationType)NativeRenderAnimationType:(id)json; ++ (HippyAnimationType)HippyAnimationType:(id)json; @end -typedef NS_ENUM(NSInteger, NativeRenderPointerEvents) { - NativeRenderPointerEventsUnspecified = 0, // Default - NativeRenderPointerEventsNone, - NativeRenderPointerEventsBoxNone, - NativeRenderPointerEventsBoxOnly, +typedef NS_ENUM(NSInteger, HippyPointerEvents) { + HippyPointerEventsUnspecified = 0, // Default + HippyPointerEventsNone, + HippyPointerEventsBoxNone, + HippyPointerEventsBoxOnly, }; -@interface HippyConvert (NativeRenderPointerEvents) +@interface HippyConvert (HippyPointerEvents) -+ (NativeRenderPointerEvents)NativeRenderPointerEvents:(id)json; ++ (HippyPointerEvents)HippyPointerEvents:(id)json; @end -typedef NS_ENUM(NSInteger, NativeRenderBorderStyle) { - NativeRenderBorderStyleSolid, - NativeRenderBorderStyleDotted, - NativeRenderBorderStyleDashed, - NativeRenderBorderStyleNone, +typedef NS_ENUM(NSInteger, HippyBorderStyle) { + HippyBorderStyleSolid, + HippyBorderStyleDotted, + HippyBorderStyleDashed, + HippyBorderStyleNone, }; -@interface HippyConvert (NativeRenderBorderStyle) +@interface HippyConvert (HippyBorderStyle) -+ (NativeRenderBorderStyle)NativeRenderBorderStyle:(id)json; ++ (HippyBorderStyle)HippyBorderStyle:(id)json; @end @@ -92,7 +92,7 @@ typedef NS_ENUM(NSInteger, HippyTextVerticalAlignType) { HippyTextVerticalAlignTop = 4, }; -@interface HippyConvert (NativeRenderTextEnumDefines) +@interface HippyConvert (HippyTextEnumDefines) + (HippyTextDecorationLineType)HippyTextDecorationLineType:(id)json; diff --git a/renderer/native/ios/utils/HippyConvert+NativeRender.m b/renderer/native/ios/utils/HippyConvert+NativeRender.m index 174d483e011..fc175cd49f2 100644 --- a/renderer/native/ios/utils/HippyConvert+NativeRender.m +++ b/renderer/native/ios/utils/HippyConvert+NativeRender.m @@ -161,45 +161,45 @@ + (CATransform3D)CATransform3D:(id)json { @end -@implementation HippyConvert (NativeRenderAnimationType) - -HP_ENUM_CONVERTER(NativeRenderAnimationType, (@{ - @"spring": @(NativeRenderAnimationTypeSpring), - @"linear": @(NativeRenderAnimationTypeLinear), - @"easeIn": @(NativeRenderAnimationTypeEaseIn), - @"easeOut": @(NativeRenderAnimationTypeEaseOut), - @"easeInEaseOut": @(NativeRenderAnimationTypeEaseInEaseOut), - @"keyboard": @(NativeRenderAnimationTypeKeyboard), +@implementation HippyConvert (HippyAnimationType) + +HP_ENUM_CONVERTER(HippyAnimationType, (@{ + @"spring": @(HippyAnimationTypeSpring), + @"linear": @(HippyAnimationTypeLinear), + @"easeIn": @(HippyAnimationTypeEaseIn), + @"easeOut": @(HippyAnimationTypeEaseOut), + @"easeInEaseOut": @(HippyAnimationTypeEaseInEaseOut), + @"keyboard": @(HippyAnimationTypeKeyboard), }), -NativeRenderAnimationTypeEaseInEaseOut, integerValue) +HippyAnimationTypeEaseInEaseOut, integerValue) @end -@implementation HippyConvert (NativeRenderPointerEvents) +@implementation HippyConvert (HippyPointerEvents) -HP_ENUM_CONVERTER(NativeRenderPointerEvents, (@{ - @"none": @(NativeRenderPointerEventsNone), - @"box-only": @(NativeRenderPointerEventsBoxOnly), - @"box-none": @(NativeRenderPointerEventsBoxNone), - @"auto": @(NativeRenderPointerEventsUnspecified) +HP_ENUM_CONVERTER(HippyPointerEvents, (@{ + @"none": @(HippyPointerEventsNone), + @"box-only": @(HippyPointerEventsBoxOnly), + @"box-none": @(HippyPointerEventsBoxNone), + @"auto": @(HippyPointerEventsUnspecified) }), -NativeRenderPointerEventsUnspecified, integerValue) +HippyPointerEventsUnspecified, integerValue) @end -@implementation HippyConvert (NativeRenderBorderStyle) +@implementation HippyConvert (HippyBorderStyle) -HP_ENUM_CONVERTER(NativeRenderBorderStyle, (@{ - @"solid": @(NativeRenderBorderStyleSolid), - @"dotted": @(NativeRenderBorderStyleDotted), - @"dashed": @(NativeRenderBorderStyleDashed), - @"none": @(NativeRenderBorderStyleNone), +HP_ENUM_CONVERTER(HippyBorderStyle, (@{ + @"solid": @(HippyBorderStyleSolid), + @"dotted": @(HippyBorderStyleDotted), + @"dashed": @(HippyBorderStyleDashed), + @"none": @(HippyBorderStyleNone), }), -NativeRenderBorderStyleSolid, integerValue) +HippyBorderStyleSolid, integerValue) @end -@implementation HippyConvert (NativeRenderTextEnumDefines) +@implementation HippyConvert (HippyTextEnumDefines) HP_ENUM_CONVERTER(HippyTextDecorationLineType, (@{ @"none": @(HippyTextDecorationLineTypeNone), diff --git a/renderer/native/ios/utils/NativeRenderGradientObject.h b/renderer/native/ios/utils/NativeRenderGradientObject.h index 2a5b085bc3c..feada75828b 100644 --- a/renderer/native/ios/utils/NativeRenderGradientObject.h +++ b/renderer/native/ios/utils/NativeRenderGradientObject.h @@ -62,8 +62,8 @@ typedef struct _LinearGradientPoints { typedef struct _CanvasInfo { CGSize size; - NativeRenderCornerRadii cornerRadii; - NativeRenderCornerInsets insets; + HippyCornerRadii cornerRadii; + HippyCornerInsets insets; }CanvasInfo; @interface NativeRenderGradientObject : NSObject diff --git a/renderer/native/ios/utils/NativeRenderGradientObject.m b/renderer/native/ios/utils/NativeRenderGradientObject.m index 6e91f4b5c15..679ad1ec1af 100644 --- a/renderer/native/ios/utils/NativeRenderGradientObject.m +++ b/renderer/native/ios/utils/NativeRenderGradientObject.m @@ -337,7 +337,7 @@ void NativeRenderDrawLinearGradientInContext(NativeRenderGradientObject *object, CGContextSaveGState(context); CGSize size = canvasInfo.size; - CGPathRef pathRef = NativeRenderPathCreateOuterOutline(NO, CGRectMake(0, 0, size.width, size.height), canvasInfo.cornerRadii); + CGPathRef pathRef = HippyPathCreateOuterOutline(NO, CGRectMake(0, 0, size.width, size.height), canvasInfo.cornerRadii); CGContextAddPath(context, pathRef); CGContextClip(context); LinearGradientPoints points = [object linearGradientPointsFromSize:size];