如何阻止UIaccessibility对viewforheaderinsection中创建的控件说“标题”?

时间:2016-08-25 15:30:53

标签: ios uiaccessibility

所以,我有一个tableview,在viewforheaderinsection内部,我创建一个视图,以编程方式创建一些控件,如按钮和分段控件。我将这些控件添加为视图的子视图,然后返回视图。问题是当Accessibility读取控件时,它会在末尾添加“heading”。它说“按钮”暂停然后说“前进”。我知道我可以将headerview转换为单元格以抑制“标题”标注,但这不是一个选项。该项目非常庞大,需要花费大量时间将标题视图更改为单元格。有没有办法在不将标题视图更改为单元格的情况下禁止“标题”标注?

6 个答案:

答案 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)
           }
       }