所以,我有一个tableview,在viewforheaderinsection内部,我创建一个视图,以编程方式创建一些控件,如按钮和分段控件。我将这些控件添加为视图的子视图,然后返回视图。问题是当Accessibility读取控件时,它会在末尾添加“heading”。它说“按钮”暂停然后说“前进”。我知道我可以将headerview转换为单元格以抑制“标题”标注,但这不是一个选项。该项目非常庞大,需要花费大量时间将标题视图更改为单元格。有没有办法在不将标题视图更改为单元格的情况下禁止“标题”标注?
答案 0 :(得分:3)
您需要实施
-(void)tableView:(UITableView *)tableView willDisplayHeaderView:(UIView *)view forSection:(NSInteger)section;
例如
- (void)tableView:(UITableView *)tableView willDisplayHeaderView:(UIView *)view forSection:(NSInteger)section
{
view.accessibilityTraits = UIAccessibilityTraitNone;
}
在该函数内部,将标题的可访问性特征设置为UIAccessibilityTraitNone,或者只删除UIAccessibilityTraitHeader。
在里面做
-(UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
不会有任何好处,因为iOS稍后会添加标题特征。您需要在显示标题之前修改特征。
答案 1 :(得分:1)
@cocoaaficionado的答案在iOS 10.3上对我不起作用。
我必须做的是:
对于标题视图,您需要通过子类化视图的accessibilityElements
属性,并使用UIAccessibilityElement
而不是UIView
/ UILabel
/ {{ 1}}直接。
UIButton
@interface NotAHeadingView : UIView
@end
@implementation NotAHeadingView
- (void)layoutSubviews
{
[super layoutSubviews];
NSMutableArray *accessibilityElements = [NSMutableArray arrayWithCapacity:self.subviews.count];
for (UIView *view in self.subviews) {
UIAccessibilityElement *element = [[UIAccessibilityElement alloc] initWithAccessibilityContainer:self];
// remove Header trait
element.accessibilityTraits = view.accessibilityTraits & ~UIAccessibilityTraitHeader;
element.accessibilityFrame = view.accessibilityFrame;
element.accessibilityLabel = view.accessibilityLabel;
element.accessibilityValue = view.accessibilityValue;
element.accessibilityHint = view.accessibilityHint;
element.accessibilityFrameInContainerSpace = view.frame;
[accessibilityElements addObject:element];
}
self.accessibilityElements = accessibilityElements;
}
@end
似乎从视图层次结构中自动继承了Header特征,甚至覆盖其直接超级视图的特征也不够。这适用于iOS 10.3设备。
这适用于简单的情况,但是当应用于非常复杂的节标题视图(管理子视图的多个子viewControllers,包括scrollViews的深层视图层次结构)时,对我来说不起作用 - 相反,重新调整此视图的工作方式要容易得多避免这些元素的节标题。 YMMV
答案 2 :(得分:0)
重写setAccessibilityTraits
这些控件,例如按钮和分段控件。
例如:
- (void)setAccessibilityTraits:(UIAccessibilityTraits)accessibilityTraits
{
accessibilityTraits = UIAccessibilityTraitButton;
[super setAccessibilityTraits:accessibilityTraits];
}
答案 3 :(得分:0)
基于CocoaAfficionado的建议,以下是对我有用的解决方案:
func tableView(_ tableView: UITableView,
willDisplayHeaderView view: UIView,
forSection section: Int) {
// Necessary to strip out the "Heading" accessibility attribute that tableview appends
// only right before rendering the header view.
for subView in view.subviews {
subView.accessibilityTraits = UIAccessibilityTraitNone | UIAccessibilityTraitStartsMediaSession
}
}
在选择标题视图后,不再读取“标题”。
存在媒体会话属性的原因是因为我也希望单击元素时不说任何内容。
答案 4 :(得分:0)
对标头元素进行子类化并覆盖其accessibilityTraits
属性是我最简单的解决方案。
例如,对于标题中的按钮,我有相同的情况,这是适用于我的解决方案:
class HeaderButton: UIButton {
private var _accessibilityTraits: UIAccessibilityTraits = UIAccessibilityTraits.button
override var accessibilityTraits: UIAccessibilityTraits {
get {
return _accessibilityTraits
}
set {
_accessibilityTraits = newValue
_accessibilityTraits.remove(UIAccessibilityTraits.header)
}
}
}
答案 5 :(得分:0)
@abalas解决方案对我有用:
尝试使用。
private var _accessibilityTraits: UIAccessibilityTraits = UIAccessibilityTraits.none
override var accessibilityTraits: UIAccessibilityTraits {
get {
return _accessibilityTraits
}
set {
_accessibilityTraits = newValue
_accessibilityTraits.remove(UIAccessibilityTraits.header)
}
}