我有一个简单的UIView层次结构。有一个包含视图B和C的父视图A.如果我将所有视图设置为辅助功能元素,则只能访问视图A.视图B和C不可点击。我需要所有视图(A,B和C)都是可访问性元素。
我知道你可以通过将所有视图(A,B和C)置于同一级别来实现这一目标,但我的应用程序中的视图层次结构不允许任何更改。
你有解决方法吗?
答案 0 :(得分:2)
视图A
是否是辅助功能元素?要使子视图可访问,包含视图必须不是可访问性元素。
view.isAccessibilityElement = false
如果您需要可访问的第三个视图A
,请将其设为B
和C
的同级视图。
答案 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中所有的元素,否则在滑动视图时该元素将被跳过。