如何禁用自定义静态 UITableViewCell 的可访问性

Posted

技术标签:

【中文标题】如何禁用自定义静态 UITableViewCell 的可访问性【英文标题】:How to disable accessibility for custom static UITableViewCell 【发布时间】:2014-05-23 08:22:36 【问题描述】:

我有一个包含 UITableViewController 和静态内容的故事板。这些单元格非常简单,只包含一个UILabel。如果我现在想禁用其中一个单元格的可访问性,我只需取消选中标签上的标记。这按预期工作。

但是,如果我现在创建一个 UITableViewCell 的空子类并将其用作我的静态单元格的单元格类,则将启用可访问性,而忽略所有设置。

我尝试覆盖-isAccessibilityElement 以返回NO,以编程方式将所有子视图accessibilityElement 属性设置为NO,但在使用VoiceOver 时仍然可以选择它。 VoiceOver 不会读取内容,似乎只有一个“ ”(在此元素上向上/向下滑动时可以听到)。

我需要做什么来禁用自定义单元格的可访问性?

【问题讨论】:

【参考方案1】:

也许,这种方式更容易。

cell.textLabel.accessibilityElementsHidden = YES;

Look this post

;)

【讨论】:

我只是在单元格本身上设置了accessibilityElementsHidden。您甚至可以在 Interface Builder 中使用用户定义的运行时属性来实现。【参考方案2】:

好的,我找到了解决方案,虽然我对此并不满意。

要禁用单元格作为可访问性元素,您需要将其变成不带任何元素的可访问性容器:

@implementation CustomCell

- (BOOL)isAccessibilityElement 
    return NO; // prerequisite for being an accessibility container


- (NSInteger)accessibilityElementCount 
    return 0; // hack to disable accessibility for this cell


- (id)accessibilityElementAtIndex:(NSInteger)index 
    return nil;


- (NSInteger)indexOfAccessibilityElement:(id)element 
    return NSNotFound;


@end

【讨论】:

【参考方案3】:

在斯威夫特中

*示例代码是 Swift 3,但设置 accessibilityElementsHidden 的关键代码行不是 Swift 3 特定的。

在显示单元格(UITableViewCell)之前,必须将单元格的accessibilityElementsHidden 属性设置为true。此属性指示包含在可访问性元素(在本例中为单元格)中的可访问性元素是否隐藏。 accessibilityElementsHidden 默认为false

在 init() 中

以下代码将在自定义 UITableViewCell 子类中初始化时设置 accessibilityElementsHidden true。如果单元格是由故事板、nib 创建或以编程方式创建的,这将起作用。

class CustomTableViewCell: UITableViewCell 

    override init(style: UITableViewCellStyle, reuseIdentifier: String?) 
        super.init(style: UITableViewCellStyle.default, reuseIdentifier: reuseIdentifier)
        self.accessibilityElementsHidden = true
    

    required init?(coder aDecoder: NSCoder) 
        super.init(coder: aDecoder)
        self.accessibilityElementsHidden = true
    

 

在 awakeFromNib() 内

如果仅从情节提要或 nib 创建 CustomTableViewCell,您可以在 awakeFromNib() 中设置属性。

class CustomTableViewCell: UITableViewCell 
    override func awakeFromNib() 
        self.accessibilityElementsHidden = true
    

 

在 tableView(_:cellForRowAt:) 内

如果您以编程方式创建和出列单元格,代码如下所示:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 

    // ... code that creates or dequeues the cell

    cell.accessibilityElementsHidden = true

    return cell

【讨论】:

以上是关于如何禁用自定义静态 UITableViewCell 的可访问性的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Swift 从 UITableViewCell 内的 NIB 调整自定义 UIView 的大小?

选择行时禁用uitableviewcell中的突出显示按钮

UITableViewCell 滚动检测

dequeueReusableCellWithIdentifier、自定义 UITableViewCell 的问题

如何禁用默认的 tvOS 焦点动画?

如何为 UITableViewCell 的子视图禁用 UITapGesture?