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

时间:2016-08-09 11:24:56

标签: ios uiview accessibility voiceover uiaccessibility

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

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

你有解决方法吗?

3 个答案:

答案 0 :(得分:2)

视图A是否是辅助功能元素?要使子视图可访问,包含视图必须是可访问性元素。

view.isAccessibilityElement = false

如果您需要可访问的第三个视图A,请将其设为BC的同级视图。

答案 1 :(得分:2)

最后,我使用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;
}

在同一视图(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];
}

答案 2 :(得分:1)

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

   A.isAccessibilityElement = true
   B.isAccessibilityElement = true
   C.isAccessibilityElement = true

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

parentView.accessibilityElements = [A, B, C]

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