From c3d765883a3c55dafb22759211d9b0fa4ea1c535 Mon Sep 17 00:00:00 2001 From: Samuel Susla Date: Wed, 28 Apr 2021 14:48:36 -0700 Subject: [PATCH] Fix frames for in text links Summary: Changelog: [internal] `accessibilityFrame` needs to take scrolling position into account. To fix that, we calculate the position dynamically. Reviewed By: mdvacca Differential Revision: D28056789 fbshipit-source-id: 3247b3e6fd64934e99563de83d163f657828e933 --- .../ComponentViews/Text/RCTAccessibilityElement.h | 7 +++++++ .../ComponentViews/Text/RCTAccessibilityElement.mm | 6 +++++- .../Text/RCTParagraphComponentAccessibilityProvider.mm | 9 ++++----- 3 files changed, 16 insertions(+), 6 deletions(-) diff --git a/React/Fabric/Mounting/ComponentViews/Text/RCTAccessibilityElement.h b/React/Fabric/Mounting/ComponentViews/Text/RCTAccessibilityElement.h index 905844d9f5..9a814731a9 100644 --- a/React/Fabric/Mounting/ComponentViews/Text/RCTAccessibilityElement.h +++ b/React/Fabric/Mounting/ComponentViews/Text/RCTAccessibilityElement.h @@ -11,6 +11,13 @@ NS_ASSUME_NONNULL_BEGIN @interface RCTAccessibilityElement : UIAccessibilityElement +/* + * Frame of the accessibility element in parent coordinate system. + * Set to `CGRectZero` to use size of the container. + * + * Default value: `CGRectZero`. + */ +@property (nonatomic, assign) CGRect frame; @end NS_ASSUME_NONNULL_END diff --git a/React/Fabric/Mounting/ComponentViews/Text/RCTAccessibilityElement.mm b/React/Fabric/Mounting/ComponentViews/Text/RCTAccessibilityElement.mm index 751c1817ba..d9dcfd73c9 100644 --- a/React/Fabric/Mounting/ComponentViews/Text/RCTAccessibilityElement.mm +++ b/React/Fabric/Mounting/ComponentViews/Text/RCTAccessibilityElement.mm @@ -12,7 +12,11 @@ - (CGRect)accessibilityFrame { UIView *container = (UIView *)self.accessibilityContainer; - return UIAccessibilityConvertFrameToScreenCoordinates(container.bounds, container); + if (CGRectEqualToRect(_frame, CGRectZero)) { + return UIAccessibilityConvertFrameToScreenCoordinates(container.bounds, container); + } else { + return UIAccessibilityConvertFrameToScreenCoordinates(_frame, container); + } } @end diff --git a/React/Fabric/Mounting/ComponentViews/Text/RCTParagraphComponentAccessibilityProvider.mm b/React/Fabric/Mounting/ComponentViews/Text/RCTParagraphComponentAccessibilityProvider.mm index 08ae2cafa1..6d456280cb 100644 --- a/React/Fabric/Mounting/ComponentViews/Text/RCTParagraphComponentAccessibilityProvider.mm +++ b/React/Fabric/Mounting/ComponentViews/Text/RCTParagraphComponentAccessibilityProvider.mm @@ -62,7 +62,7 @@ using namespace facebook::react; accessibilityLabel = RCTNSStringFromString(_attributedString.getString()); } // add first element has the text for the whole textview in order to read out the whole text - UIAccessibilityElement *firstElement = + RCTAccessibilityElement *firstElement = [[RCTAccessibilityElement alloc] initWithAccessibilityContainer:_view.superview]; firstElement.isAccessibilityElement = YES; firstElement.accessibilityTraits = UIAccessibilityTraitStaticText; @@ -89,8 +89,8 @@ using namespace facebook::react; truncatedText = fragmentText; return; } - UIAccessibilityElement *element = - [[UIAccessibilityElement alloc] initWithAccessibilityContainer:self->_view]; + RCTAccessibilityElement *element = + [[RCTAccessibilityElement alloc] initWithAccessibilityContainer:self->_view]; element.isAccessibilityElement = YES; if ([value isEqualToString:@"link"]) { element.accessibilityTraits = UIAccessibilityTraitLink; @@ -100,8 +100,7 @@ using namespace facebook::react; numberOfButtons++; } element.accessibilityLabel = fragmentText; - element.accessibilityFrame = - UIAccessibilityConvertFrameToScreenCoordinates(fragmentRect, self->_view); + element.frame = fragmentRect; [elements addObject:element]; }];