From 3f3ed7ec28361d57c9f2c8897eba361ba3f4f3ff Mon Sep 17 00:00:00 2001 From: Tony Wen Date: Sat, 4 Oct 2025 21:54:41 +1000 Subject: [PATCH] Fix Text component touch area to include padding on iOS When a Text component has padding, onPress events were not triggered when clicking in the padding area on iOS. This was caused by overly strict hit testing logic in getEventEmitterWithAttributeString. The previous logic rejected touch points where fraction == 0 or 1, which occurs when clicking in padding areas. This fix removes the fraction check and allows any valid character index within the text storage to return an event emitter. Fixes #54056 --- .../textlayoutmanager/RCTTextLayoutManager.mm | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/react-native/ReactCommon/react/renderer/textlayoutmanager/platform/ios/react/renderer/textlayoutmanager/RCTTextLayoutManager.mm b/packages/react-native/ReactCommon/react/renderer/textlayoutmanager/platform/ios/react/renderer/textlayoutmanager/RCTTextLayoutManager.mm index 3b4109c44aecc1..90448421b39923 100644 --- a/packages/react-native/ReactCommon/react/renderer/textlayoutmanager/platform/ios/react/renderer/textlayoutmanager/RCTTextLayoutManager.mm +++ b/packages/react-native/ReactCommon/react/renderer/textlayoutmanager/platform/ios/react/renderer/textlayoutmanager/RCTTextLayoutManager.mm @@ -260,18 +260,18 @@ - (SharedEventEmitter)getEventEmitterWithAttributeString:(AttributedString)attri _textStorageAndLayoutManagerWithAttributesString:[self _nsAttributedStringFromAttributedString:attributedString] paragraphAttributes:paragraphAttributes size:frame.size]; + NSLayoutManager *layoutManager = textStorage.layoutManagers.firstObject; NSTextContainer *textContainer = layoutManager.textContainers.firstObject; CGFloat fraction; NSUInteger characterIndex = [layoutManager characterIndexForPoint:point - inTextContainer:textContainer - fractionOfDistanceBetweenInsertionPoints:&fraction]; + inTextContainer:textContainer + fractionOfDistanceBetweenInsertionPoints:&fraction]; - // If the point is not before (fraction == 0.0) the first character and not - // after (fraction == 1.0) the last character, then the attribute is valid. - if (textStorage.length > 0 && (fraction > 0 || characterIndex > 0) && - (fraction < 1 || characterIndex < textStorage.length - 1)) { + // Modified: Allow clicks anywhere in the text storage bounds, not just on characters + // This fixes the issue where padding areas are not clickable + if (textStorage.length > 0 && characterIndex < textStorage.length) { NSData *eventEmitterWrapper = (NSData *)[textStorage attribute:RCTAttributedStringEventEmitterKey atIndex:characterIndex effectiveRange:NULL];