ComponentKit/Accessibility/CKAccessibilityContainerComponent.mm (51 lines of code) (raw):

/* * Copyright (c) 2014-present, Facebook, Inc. * All rights reserved. * * This source code is licensed under the BSD-style license found in the * LICENSE file in the root directory of this source tree. An additional grant * of patent rights can be found in the PATENTS file in the same directory. * */ #import "CKAccessibilityContainerComponent.h" #import <ComponentKit/CKComponentInternal.h> @interface CKAccessibilityContainerComponentView: UIView @property (nonatomic) CKAccessibilityElementsFactory accessibilityElementsFactory; @end @implementation CKAccessibilityContainerComponentView { @package NSArray<UIAccessibilityElement *> *_accessibilityElements; } - (BOOL)isAccessibilityElement { return NO; // The container is not accessible by itself } - (NSArray *)accessibilityElements { if (!_accessibilityElements && _accessibilityElementsFactory) { _accessibilityElements = _accessibilityElementsFactory(self); } return _accessibilityElements; } @end @interface CKAccessibilityContainerComponent : CKCompositeComponent @end @implementation CKAccessibilityContainerComponent + (instancetype)newWithComponent:(CKComponent * _Nullable)component accessibilityElementsFactory:(CKAccessibilityElementsFactory)factory { return [super newWithView:{ [CKAccessibilityContainerComponentView class], { {@selector(setAccessibilityElementsFactory:), factory}, } } component:component]; } #pragma mark - CK overrides - (CK::Component::MountResult)mountInContext:(const CK::Component::MountContext &)context layout:(const RCLayout &)layout supercomponent:(CKComponent *)supercomponent { const auto mountResult = [super mountInContext:context layout:layout supercomponent:supercomponent]; // Reset the cached attributes on mount in order to refresh them every time we remount the component // and avoid having the stale values. if (const auto mountedView = self.mountedView) { ((CKAccessibilityContainerComponentView *)mountedView)->_accessibilityElements = nil; } return mountResult; } @end CKComponent *CKAccessibilityContainerComponentWrapper(CKComponent * _Nullable component, CKAccessibilityElementsFactory factory) { return [CKAccessibilityContainerComponent newWithComponent:component accessibilityElementsFactory:factory]; }