自定义 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