自定义 UITableViewCell 可访问性

Posted

技术标签:

【中文标题】自定义 UITableViewCell 可访问性【英文标题】:Custom UITableViewCell accessibility 【发布时间】:2014-03-17 16:09:53 【问题描述】:

如何单独设置 UITableViewCells 子视图的可访问性。 它不应该作为完整的单元格访问吗?

【问题讨论】:

您能告诉我们您已经尝试过什么吗? @Mack:我已经尝试禁用单元格可访问性并启用子视图可访问性。 @SwapnilN,在tableView(_:cellForRowAt:) 中进行,而不是在您的自定义单元格的init(style:reuseIdentifier:) 方法中。见this answer。 【参考方案1】:

如果您的表格视图单元格仅包含文本,则启用该单元格的可访问性即可,它将读出整个单元格。如果您有其他对象和按钮,建议使用UITableViewCell 的子类并重写-accessibilityElements 方法以返回所有可访问的元素。

一些代码:

#import "CustomCell.h"

@implementation CustomCell

- (void)awakeFromNib

    [super awakeFromNib];
    self.accessibilityElements = @[self.view1, self.label, self.imageView];

以下帖子可能会有所帮助:

http://cocoacaffeine.wordpress.com/2013/11/29/little-tricks-of-accessibility/

【讨论】:

对 UITesting 也很有帮助...可以使用可访问性检查器找到一个元素,但 UITest 找不到该元素。这解决了问题。【参考方案2】:

tableView(_:cellForRowAt:) 中使单元格不可访问而您的子视图可访问。

isAccessibilityElement = false
mySubview1.isAccessibilityElement = true
mySubview2.isAccessibilityElement = true
mySubview3.isAccessibilityElement = true

我也陷入了困境,因为我(试图提高效率)将上述内容放在我的自定义单元格的 init(style:reuseIdentifier:) 方法中。但是,这不起作用,可能是因为 UITableView 在初始化每个单元格后重置了所有内容。

相关:Accessibility Programming Guide for ios: Enhance the Accessibility of Table Views

【讨论】:

在您的情况下,单元格是在故事板或笔尖中创建的吗?如果是这样,您需要将该代码放入 init?(coder:) 中,我认为它应该可以工作。从情节提要或笔尖创建单元格时,不会调用 init(style:reuseIdentifier:)。 我以编程方式创建单元格。 感谢您确认@mattdipasquale!我很想知道在 init() 方法中设置可访问性属性是否有问题。我发布了另一个问题的答案,其中包括在 init() 中设置可访问性作为建议的解决方案之一。我在单元格 init() 中的子视图上测试了将 isAccessibilityElement 设置为 true 并且没有看到在单元格最初显示或回收时它会丢失。我可能不会和你测试相同的场景。 为了清楚起见,我相信这是正确的答案,并且 tableView(_:cellForRowAt:) 是在单元格上和单元格内设置可访问性属性的最佳位置。在我的测试中,您似乎还可以在自定义单元格的 init() 中设置属性。 I answered a different VoiceOver question 其中一种解决方案包括在 init() 方法中设置可访问性属性。如果我确认这是有问题的,我将更新该答案并在此处发布更新。谢谢!【参考方案3】:

有助于@ma11hew28 的回答,这是另一种可以节省一些代码行的方法,

Swift 5

class ServiceTableViewCell: UITableViewCell 
    override func awakeFromNib() 
        super.awakeFromNib()
        self.selectionStyle = .none
        self.isAccessibilityElement = false //not allowing accessibility for the cell itself
        self.accessibilityElements = [mySubview1!, mySubview2!, mySubview3!] // but allowing accessibility in the cell's subviews
    

【讨论】:

【参考方案4】:

我尝试了这里提出的所有解决方案,但都没有解决我的问题。

通过将单元格的 contentView.accessibilityElementsHidden 设置为 true 并将我的 UI 项 isAccessibilityElement 设置为 true,我能够隐藏我的单元格以使其无法访问并仅突出显示 UITableViewCell 中的元素。

contentView.accessibilityElementsHidden = true

UIElement.isAccessibilityElement = true

【讨论】:

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

具有可访问性的 UITableViewCell 中的 UICollectionView

将多个自定义 UITableViewCell 链接到单个 xib

自定义 UITableview 单元格可访问性无法正常工作

自定义后退按钮的可访问性

提高可访问性:自定义 Accordion jQuery 和 HTML?

Flutter:如何将可访问性焦点集中到自定义应用栏