Skip to content

Commit ac274f3

Browse files
fix(ios): prevent missing hairlineWidth border strokes at subpixel Y offsets (#58054)
1 parent 7eafaa2 commit ac274f3

3 files changed

Lines changed: 9 additions & 8 deletions

File tree

packages/react-native/React/Fabric/Mounting/ComponentViews/View/RCTViewComponentView.mm

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -887,7 +887,9 @@ static void RCTAddContourEffectToLayer(
887887
UIEdgeInsets imageCapInsets = image.capInsets;
888888
CGRect contentsCenter = CGRect{
889889
CGPoint{imageCapInsets.left / imageSize.width, imageCapInsets.top / imageSize.height},
890-
CGSize{(CGFloat)1.0 / imageSize.width, (CGFloat)1.0 / imageSize.height}};
890+
CGSize{
891+
MAX(0, (imageSize.width - imageCapInsets.left - imageCapInsets.right) / imageSize.width),
892+
MAX(0, (imageSize.height - imageCapInsets.top - imageCapInsets.bottom) / imageSize.height)}};
891893
layer.contents = (id)image.CGImage;
892894
layer.contentsScale = image.scale;
893895

packages/react-native/React/Views/RCTBorderDrawing.m

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -247,12 +247,8 @@ static CGPathRef RCTPathCreateOuterOutline(BOOL drawToEdge, CGRect rect, RCTCorn
247247

248248
const CGSize size = makeStretchable ? (CGSize){
249249
// 1pt for the middle stretchable area along each axis
250-
// we also need to round the edge insets to avoid border bleeding
251-
// this is because if the size is decimal, when calculating the unit
252-
// rectangle for CALayer.contentsCenter we encounter rounding errors
253-
// which causes visual glitches
254-
ceil(edgeInsets.left) + 1 + ceil(edgeInsets.right),
255-
ceil(edgeInsets.top) + 1 + ceil(edgeInsets.bottom),
250+
edgeInsets.left + 1 + edgeInsets.right,
251+
edgeInsets.top + 1 + edgeInsets.bottom,
256252
} : viewSize;
257253

258254
UIGraphicsImageRenderer *const imageRenderer =

packages/react-native/React/Views/RCTView.m

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -860,7 +860,10 @@ - (void)displayLayer:(CALayer *)layer
860860
CGSize size = image.size;
861861
UIEdgeInsets insets = image.capInsets;
862862
CGRectMake(
863-
insets.left / size.width, insets.top / size.height, (CGFloat)1.0 / size.width, (CGFloat)1.0 / size.height);
863+
insets.left / size.width,
864+
insets.top / size.height,
865+
MAX(0, (size.width - insets.left - insets.right) / size.width),
866+
MAX(0, (size.height - insets.top - insets.bottom) / size.height));
864867
});
865868

866869
layer.contents = (id)image.CGImage;

0 commit comments

Comments
 (0)