From 729c6d2f415d6fe60fd00f2f3585a3c103e08783 Mon Sep 17 00:00:00 2001 From: Samuel Susla Date: Thu, 18 Mar 2021 06:53:41 -0700 Subject: [PATCH] Fix accessibilityElement accessibility frame Summary: Changelog: [internal] `accessibilityElement.accessibilityFrame` returns CGRect in screen's coordinate space. Screen coordinate space changes whenever user scrolls. Therefore they have to be computed whenever on demand rather than precomputed. Reviewed By: mdvacca Differential Revision: D27118793 fbshipit-source-id: c48a2b9fc3f25b6ae797104371a2627193f4f79a --- .../Text/RCTAccessibilityElement.h | 16 ++++++++++++++++ .../Text/RCTAccessibilityElement.mm | 18 ++++++++++++++++++ ...TParagraphComponentAccessibilityProvider.mm | 4 +++- 3 files changed, 37 insertions(+), 1 deletion(-) create mode 100644 React/Fabric/Mounting/ComponentViews/Text/RCTAccessibilityElement.h create mode 100644 React/Fabric/Mounting/ComponentViews/Text/RCTAccessibilityElement.mm diff --git a/React/Fabric/Mounting/ComponentViews/Text/RCTAccessibilityElement.h b/React/Fabric/Mounting/ComponentViews/Text/RCTAccessibilityElement.h new file mode 100644 index 00000000000..905844d9f5b --- /dev/null +++ b/React/Fabric/Mounting/ComponentViews/Text/RCTAccessibilityElement.h @@ -0,0 +1,16 @@ +/* + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +#import + +NS_ASSUME_NONNULL_BEGIN + +@interface RCTAccessibilityElement : UIAccessibilityElement + +@end + +NS_ASSUME_NONNULL_END diff --git a/React/Fabric/Mounting/ComponentViews/Text/RCTAccessibilityElement.mm b/React/Fabric/Mounting/ComponentViews/Text/RCTAccessibilityElement.mm new file mode 100644 index 00000000000..751c1817bad --- /dev/null +++ b/React/Fabric/Mounting/ComponentViews/Text/RCTAccessibilityElement.mm @@ -0,0 +1,18 @@ +/* + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +#import "RCTAccessibilityElement.h" + +@implementation RCTAccessibilityElement + +- (CGRect)accessibilityFrame +{ + UIView *container = (UIView *)self.accessibilityContainer; + return UIAccessibilityConvertFrameToScreenCoordinates(container.bounds, container); +} + +@end diff --git a/React/Fabric/Mounting/ComponentViews/Text/RCTParagraphComponentAccessibilityProvider.mm b/React/Fabric/Mounting/ComponentViews/Text/RCTParagraphComponentAccessibilityProvider.mm index fc40be86ace..08ae2cafa17 100644 --- a/React/Fabric/Mounting/ComponentViews/Text/RCTParagraphComponentAccessibilityProvider.mm +++ b/React/Fabric/Mounting/ComponentViews/Text/RCTParagraphComponentAccessibilityProvider.mm @@ -13,6 +13,7 @@ #import #import +#import "RCTAccessibilityElement.h" #import "RCTConversions.h" #import "RCTFabricComponentsPlugins.h" #import "RCTLocalizationProvider.h" @@ -61,7 +62,8 @@ 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 = [[UIAccessibilityElement alloc] initWithAccessibilityContainer:_view]; + UIAccessibilityElement *firstElement = + [[RCTAccessibilityElement alloc] initWithAccessibilityContainer:_view.superview]; firstElement.isAccessibilityElement = YES; firstElement.accessibilityTraits = UIAccessibilityTraitStaticText; firstElement.accessibilityLabel = accessibilityLabel;