CALayer 的动态可访问性标签

Posted

技术标签:

【中文标题】CALayer 的动态可访问性标签【英文标题】:Dynamic Accessibility Label for CALayer 【发布时间】:2013-05-07 21:17:40 【问题描述】:

如何使 CALayer 可访问?具体来说,我希望图层能够动态更改其标签,因为它可以随时更改。官方文档的sample code 确实不允许这样做。

【问题讨论】:

这里有一个类似的帖子:***.com/q/13254122/1804403 但它明确拒绝 UIAccessibilityContainer 【参考方案1】:

以下假设您有一个超级视图,其层都是 AccessableLayer 类,但如果您有更复杂的布局,可以修改此方案来处理它。

为了使CALayer 可访问,您需要一个实现UIAccessibilityContainer 方法的父视图。这是执行此操作的一种建议方法。

首先,让每一层都拥有自己的UIAccessibilityElement

@interface AccessableLayer : CALayer 
@property (nonatomic) UIAccessibilityElement *accessibilityElement;
@end

现在在其实现中,您可以在元素发生变化时对其进行修改:

@implementation AccessableLayer

... self.accessibilityElement.accessibilityLabel = text;

@end

AccessableLayer 永远不会创建UIAccessibilityElement,因为构造函数需要一个 UIAccessibilityContainer。所以让超级视图创建并分配它:

#pragma mark - accessibility

// The container itself is not accessible, so return NO
- (BOOL)isAccessibilityElement

    return NO;


// The following methods are implementations of UIAccessibilityContainer protocol methods.
- (NSInteger)accessibilityElementCount

    return [self.layer.sublayers count];


- (id)accessibilityElementAtIndex:(NSInteger)index

    AccessableLayer *panel = [self.layer.sublayers objectAtIndex:index];
    UIAccessibilityElement *element = panel.accessibilityElement;
    if (element == nil) 
        element = [[UIAccessibilityElement alloc] initWithAccessibilityContainer:self];
        element.accessibilityFrame = [self convertRect:panel.frame toView:[UIApplication sharedApplication].keyWindow];
        element.accessibilityTraits = UIAccessibilityTraitButton;
        element.accessibilityHint = @"some hint";
        element.accessibilityLabel = @"some text";
        panel.accessibilityElement = element;
    
    return element;


- (NSInteger)indexOfAccessibilityElement:(id)element

    int numElements = [self accessibilityElementCount];
    for (int i = 0; i < numElements; i++) 
        if (element == [self accessibilityElementAtIndex:i]) 
            return i;
        
    
    return NSNotFound;

【讨论】:

你在这段代码中定义了两次- (id)accessibilityElementAtIndex:(NSInteger)index

以上是关于CALayer 的动态可访问性标签的主要内容,如果未能解决你的问题,请参考以下文章

使用可访问性标识符访问标签文本

可访问性标签 storekit 用户输入

允许/阻止标签的可访问性字体大小调整

EarlGrey 可以使用多个可访问性标签或文本

html 隐藏标签和内容,不会损害可访问性

在不破坏可访问性或 PDF 标签的情况下连接 PDF