diff --git a/packages/react-native/Libraries/Text/Text/NSTextStorage+FontScaling.m b/packages/react-native/Libraries/Text/Text/NSTextStorage+FontScaling.m index fa86a458970a95..c92b2e94c6a1b5 100644 --- a/packages/react-native/Libraries/Text/Text/NSTextStorage+FontScaling.m +++ b/packages/react-native/Libraries/Text/Text/NSTextStorage+FontScaling.m @@ -66,6 +66,15 @@ - (RCTTextSizeComparisonOptions)compareToSize:(CGSize)size thresholdRatio:(CGFlo NSLayoutManager *layoutManager = self.layoutManagers.firstObject; NSTextContainer *textContainer = layoutManager.textContainers.firstObject; + // A workaround for truncatedGlyphRangeInLineFragmentForGlyphAtIndex returning NSNotFound when text has only + // one character and it gets truncated + if ([self length] == 1) { + CGSize characterSize = [[self string] sizeWithAttributes:[self attributesAtIndex:0 effectiveRange:nil]]; + if (characterSize.width > size.width) { + return RCTTextSizeComparisonLarger; + } + } + [layoutManager ensureLayoutForTextContainer:textContainer]; // Does it fit the text container? diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/text/TextLayoutManager.java b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/text/TextLayoutManager.java index 3d420f8b9eac51..76b47ca863fc3d 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/text/TextLayoutManager.java +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/text/TextLayoutManager.java @@ -629,8 +629,8 @@ private static Layout createLayout( && ((maximumNumberOfLines != ReactConstants.UNSET && maximumNumberOfLines != 0 && layout.getLineCount() > maximumNumberOfLines) - || (heightYogaMeasureMode != YogaMeasureMode.UNDEFINED - && layout.getHeight() > height))) { + || (heightYogaMeasureMode != YogaMeasureMode.UNDEFINED && layout.getHeight() > height) + || (text.length() == 1 && layout.getLineWidth(0) > width))) { // TODO: We could probably use a smarter algorithm here. This will require 0(n) // measurements based on the number of points the font size needs to be reduced by. currentFontSize -= Math.max(1, (int) PixelUtil.toPixelFromDIP(1)); @@ -648,6 +648,9 @@ private static Layout createLayout( text.getSpanFlags(span)); text.removeSpan(span); } + if (boring != null) { + boring = BoringLayout.isBoring(text, paint); + } layout = createLayout( text,