作为辅助功能元素的 VoiceOver 父视图和子视图

paw*_*221 9 accessibility uiview ios voiceover uiaccessibility

我有一个简单的 UIView 层次结构。有一个包含视图 B 和 C 的父视图 A。如果我将所有视图设置为可访问性元素,则只有视图 A 可访问。视图 B 和 C 不可点击。我需要所有视图(A、B 和 C)都是可访问性元素。

我知道您可以通过将所有视图(A、B 和 C)置于同一级别来实现这一点,但我的应用程序中的视图层次结构不允许任何更改。

你有什么解决办法吗?

Pre*_*ani 7

1)将所有视图即A、B、C作为accessibilityElement。

   A.isAccessibilityElement = true
   B.isAccessibilityElement = true
   C.isAccessibilityElement = true
Run Code Online (Sandbox Code Playgroud)

2)如果你的父视图是parentView,那么将所有这些视图设置为其AccessibilityElements

parentView.accessibilityElements = [A, B, C]
Run Code Online (Sandbox Code Playgroud)

PS:-accessibilityElements 创建一组数组中提到的所有元素。这也用于更改元素的顺序。但您必须记住的唯一一件事是将 ParentView 中的所有元素提及到此数组,否则在视图上滑动时该元素将被跳过。


Jus*_*tin 6

视图A是可访问性元素吗?要使子视图可访问,包含的视图不能是可访问元素。

view.isAccessibilityElement = false
Run Code Online (Sandbox Code Playgroud)

如果您需要第三个视图 ,A可访问,则将其设为B和的同级视图C


paw*_*221 6

最后,我使用 UIAccessibilityContainer 协议和我现有的视图层次结构解决了它:A(父)、B(子)和 C(子)。我使用了另一个视图,比如 X 是 A 的父视图,并在其中实现了 UIAccessibilityContainer 协议。这是创建在视图 X 中创建的 UIAccessibilityElements 数组的示例代码。

- (NSArray *)voiceOverElements {
    if (!_voiceOverElements) {
        UIAccessibilityElement *element = [[UIAccessibilityElement alloc] initWithAccessibilityContainer:self];
        CGRect frame = UIAccessibilityConvertFrameToScreenCoordinates(A.frame, self);
        element.accessibilityFrame = frame;
        _voiceOverElements = @[element];
        for (UIView *view in A.subviews) {
            UIAccessibilityElement * element = [[UIAccessibilityElement alloc] initWithAccessibilityContainer:self];
            CGRect frame = UIAccessibilityConvertFrameToScreenCoordinates(view.frame, A);
            element.accessibilityFrame = frame;
            _voiceOverElements = [_voiceOverElements arrayByAddingObject:element];
        }
    }
    return _voiceOverElements;
}
Run Code Online (Sandbox Code Playgroud)

在同一个视图(X)中,UIAccessibilityContainer 协议实现如下:

- (BOOL)isAccessibilityElement {
    return NO;
}

- (id)accessibilityElementAtIndex:(NSInteger)index {
    return [self.voiceOverElements objectAtIndex:index];
}

- (NSInteger)accessibilityElementCount {
    return self.voiceOverElements.count;
}

- (NSInteger)indexOfAccessibilityElement:(id)element {
    return [self.voiceOverElements indexOfObject:element];
}
Run Code Online (Sandbox Code Playgroud)