From 15179f1798b277c1836441fcf7f3b7f0bd5a4636 Mon Sep 17 00:00:00 2001 From: Nikita Tuk Date: Tue, 21 Nov 2017 11:48:37 -0800 Subject: [PATCH] Fixed fractional border width on iOS Summary: Incorrect render for borders that are not proportional to device pixel: borders get stretched and become significantly bigger than expected. Rdar: http://www.openradar.me/15959788 Incorrect render for borders that are not proportional to device pixel: borders get stretched and become significantly bigger than expected. Rdar: http://www.openradar.me/15959788 Reviewed By: shergin Differential Revision: D6317674 fbshipit-source-id: 6bc331447458583a02c0e56d0d011a31d31d70a8 --- React/Views/RCTBorderDrawing.m | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/React/Views/RCTBorderDrawing.m b/React/Views/RCTBorderDrawing.m index 2c661a2e36d248..ec85e92c4d68ec 100644 --- a/React/Views/RCTBorderDrawing.m +++ b/React/Views/RCTBorderDrawing.m @@ -59,6 +59,15 @@ RCTCornerInsets RCTGetCornerInsets(RCTCornerRadii cornerRadii, }; } +static UIEdgeInsets RCTRoundInsetsToPixel(UIEdgeInsets edgeInsets) { + edgeInsets.top = RCTRoundPixelValue(edgeInsets.top); + edgeInsets.bottom = RCTRoundPixelValue(edgeInsets.bottom); + edgeInsets.left = RCTRoundPixelValue(edgeInsets.left); + edgeInsets.right = RCTRoundPixelValue(edgeInsets.right); + + return edgeInsets; +} + static void RCTPathAddEllipticArc(CGMutablePathRef path, const CGAffineTransform *m, CGPoint origin, @@ -195,6 +204,11 @@ static CGContextRef RCTUIGraphicsBeginImageContext(CGSize size, CGColorRef backg const BOOL hasCornerRadii = RCTCornerRadiiAreAboveThreshold(cornerRadii); const RCTCornerInsets cornerInsets = RCTGetCornerInsets(cornerRadii, borderInsets); + // Incorrect render for borders that are not proportional to device pixel: borders get stretched and become + // significantly bigger than expected. + // Rdar: http://www.openradar.me/15959788 + borderInsets = RCTRoundInsetsToPixel(borderInsets); + const BOOL makeStretchable = (borderInsets.left + cornerInsets.topLeft.width + borderInsets.right + cornerInsets.bottomRight.width <= viewSize.width) &&