首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何防止UIaccessibility对在viewforheaderinsection中创建的控件说"heading“?

如何防止UIaccessibility对在viewforheaderinsection中创建的控件说"heading“?
EN

Stack Overflow用户
提问于 2016-08-25 23:30:53
回答 5查看 4.8K关注 0票数 7

因此,我有一个表视图,在viewforheaderinsection中,我创建了一个视图,以编程方式创建了一些控件,如按钮和分段控件。我将这些控件添加为视图的子视图,然后返回视图。问题是,当Accessibility读取控件时,它会在末尾附加"heading“。它说“按钮”停顿,然后说“标题”。我知道我可以将headerview转换为单元格来抑制"heading“标注,但这不是一个选项。这个项目相当大,需要很多时间才能将标题视图转换为单元格。有没有一种方法可以在不将标题视图更改为单元格的情况下抑制“标题”标注?

EN

回答 5

Stack Overflow用户

发布于 2017-03-18 12:14:19

你需要实现

代码语言:javascript
复制
-(void)tableView:(UITableView *)tableView willDisplayHeaderView:(UIView *)view forSection:(NSInteger)section;

例如

代码语言:javascript
复制
- (void)tableView:(UITableView *)tableView willDisplayHeaderView:(UIView *)view forSection:(NSInteger)section
{
     view.accessibilityTraits = UIAccessibilityTraitNone;
}

在该函数内部,将头文件的可访问性属性设置为UIAccessibilityTraitNone,或者简单地删除UIAccessibilityTraitHeader。

在里面做

代码语言:javascript
复制
-(UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section 

这不会有任何好处,因为iOS稍后会添加header特征。您需要在显示标题之前修改特征。

票数 5
EN

Stack Overflow用户

发布于 2017-05-25 09:53:27

@cocoaaficionado的答案在我的iOS 10.3上不起作用。

我要做的是:

对于header视图,您需要子类化视图的accessibilityElements属性,并直接使用UIAccessibilityElements而不是UIView/UILabel/UIButton

代码语言:javascript
复制
@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

UIView似乎会自动从视图层次结构中继承Header特征,即使覆盖直接superview的特征也是不够的。对我来说,这在iOS 10.3设备上是有效的。

这适用于简单的情况,但不适用于非常复杂的节标题视图(管理子视图的多个子viewControllers,包括scrollViews的深层视图层次结构)-相反,更容易改变这个视图的工作方式,以避免这些元素的节标题。YMMV

票数 2
EN

Stack Overflow用户

发布于 2019-11-07 20:10:18

Swift解决方案

对我来说,对header元素进行子类化并覆盖它们的accessibilityTraits属性是最简单的解决方案。

例如,我对header中的按钮也有同样的情况,下面是适用于我的解决方案:

代码语言:javascript
复制
class HeaderButton: UIButton {

    private var _accessibilityTraits: UIAccessibilityTraits = UIAccessibilityTraits.button
    override var accessibilityTraits: UIAccessibilityTraits {
        get {
            return _accessibilityTraits
        }
        set {
            _accessibilityTraits = newValue
            _accessibilityTraits.remove(UIAccessibilityTraits.header)
        }
    }

}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39149259

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档