【问题标题】:VoiceOver parent and child views as accessibility elementsVoiceOver 父视图和子视图作为辅助功能元素
【发布时间】:2016-08-09 11:24:56
【问题描述】:

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

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

你有什么解决办法吗?

【问题讨论】:

  • 你研究过 UIAccessibilityContainer 协议吗?

标签: ios uiview accessibility voiceover uiaccessibility


【解决方案1】:

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

view.isAccessibilityElement = false

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

【讨论】:

  • 我无法创建 B 和 C 的 A 兄弟,因为这已经是我的应用程序中的视图层次结构,但我使用 A 的父视图和 UIAccessibilityContainer 协议来解决我的问题。您可以在下面的答案中找到解决方案的详细信息。
【解决方案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];
}

【讨论】:

    【解决方案3】:

    1) 将所有视图(即 A、B、C)设为可访问性元素。

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

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

    parentView.accessibilityElements = [A, B, C]
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多