在 UIButton/UITableViewCell/UICollectionViewCell 选择上禁用 VoiceOver

Posted

技术标签:

【中文标题】在 UIButton/UITableViewCell/UICollectionViewCell 选择上禁用 VoiceOver【英文标题】:Disable VoiceOver on UIButton/UITableViewCell/UICollectionViewCell Selection 【发布时间】:2016-05-10 14:34:59 【问题描述】:

打开 VoiceOver 后,当焦点位于 UIButton/UITableViewCell/UICollectionViewCell 时,VoiceOver 会读取它的辅助功能标签一次。

然后,一旦用户双击以选择 UIButton/UITableViewCell/UICollectionViewCell,VoiceOver 会再次读取相同的可访问性标签,除了对 UIButton/UITableViewCell/@987654330 执行操作(导航等) @选择。

我进行了很多搜索,但无法找到一种方法来停止/禁用 VoiceOver 阅读 UIButton/UITableViewCell/UICollectionViewCell 选择上的辅助功能标签。

任何帮助将不胜感激。

【问题讨论】:

你找到答案了吗?我遇到了同样的问题。 抱歉延迟回复。我通过强制选择另一个可访问性元素来处理它。例如,从 TableView/CollectionView 中进行选择后,我应该导航到新的 UI。我正在做的是在导航完成后立即强制选择新 UI 导航栏的左栏按钮项。使用UIAccessibilityPostNotification 进行选择。这样,它开始读取新选择的项目。请参阅此link 进行选择 【参考方案1】:

斯威夫特 5

对我有用的是设置myElementIWantSilent.accessibilityTraits = .none

编辑:我应该注意到这些也存在:

viewContainingSilentElement.isAccessibilityElement = true
viewContainingSilentElement.accessibilityTraits = .image
viewContainingSilentElement.accessibilityLabel = "some text i want read aloud"

iPhone 8 ios 14.5.1 XCode 12.5

【讨论】:

【参考方案2】:

让我们看看如何停止对 UIButtonUITableViewCell 元素的 VoiceOver 辅助功能阅读。

UIBUTTON:只需创建自己的按钮类并覆盖accessibilityActivate 方法。

class BoutonLabelDoubleTap: UIButton 

    override func accessibilityActivate() -> Bool 
        accessibilityLabel = ""
        return true
    

UITABLEVIEWCELL:要遵循的两个步骤。

创建一个覆盖accessibilityActivate 方法的自定义UIAccessibilityElement

class TableViewCellLabelDoubleTap: UIAccessibilityElement 

    override init(accessibilityContainer container: Any) 
        super.init(accessibilityContainer: container)
    

    override var accessibilityTraits: UIAccessibilityTraits 
        get  return UIAccessibilityTraitNone 
        set    
    

    override func accessibilityActivate() -> Bool 
        accessibilityLabel = ""
        return true
    

使用之前创建的类在视图控制器中实现表格视图单元格。

class TestButtonTableViewController: UIViewController,UITableViewDataSource,UITableViewDelegate 

    @IBOutlet weak var myTableView: UITableView!
    @IBOutlet weak var bottomButton: UIButton!

    override func viewDidLoad() 
        super.viewDidLoad()
        myTableView.delegate = self as UITableViewDelegate
        myTableView.dataSource = self as UITableViewDataSource
    

    func numberOfSections(in tableView: UITableView) -> Int 
        return 1
    

    func tableView(_ tableView: UITableView,
                   numberOfRowsInSection section: Int) -> Int 
        return 2
    

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

        let zeCell = tableView.dequeueReusableCell(withIdentifier: "myPersoCell",
                                                   for: indexPath)

        zeCell.accessibilityElements = nil
        var elements = [UIAccessibilityElement]()

        let a11yEltCell = TableViewCellLabelDoubleTap(accessibilityContainer: zeCell)
        a11yEltCell.accessibilityLabel = "cell number " + String(indexPath.row)
        a11yEltCell.accessibilityFrameInContainerSpace = CGRect(x: 0,
                                                                y: 0,
                                                                width: zeCell.contentView.frame.size.width,
                                                                height: zeCell.contentView.frame.size.height)
        elements.append(a11yEltCell)
        zeCell.accessibilityElements = elements

        return zeCell
    

我没有尝试过UICollectionViewCell,但它应该与UITableViewCell 的基本原理相同。

按照这些代码 sn-ps,您现在可以决定 VoiceOver 是否应该在选择时停止读出所需的元素标签

【讨论】:

我们如何停止“1 of 10”、“2 of 10”等的语音。在 UIPickerView 中遇到问题,每当我们滑动到任何元素时,它总是显示“1 of 10”跨度> @Nishchith 在我提供的这个可滚动视图示例中,我不确定您是否会为每个单元格听“1 over x”,不是吗? (现在已经超过 2 年了⏳)我没有用选择器视图进行任何测试,我提供的唯一答案是 ***.com/a/61018428/3825084,对不起。 当然谢谢。我正面临当前索引未正确表达的问题。当我滑动时,它总是显示“总共 1”。您知道只有在选择器滑动发生时我们才能完全禁用画外音吗?关于设置我自己的accessibilityLabel。它发出可访问性标签文本,然后是默认文本。 ***.com/questions/68183280/…

以上是关于在 UIButton/UITableViewCell/UICollectionViewCell 选择上禁用 VoiceOver的主要内容,如果未能解决你的问题,请参考以下文章

秋的潇洒在啥?在啥在啥?

上传的数据在云端的怎么查看,保存在啥位置?

在 React 应用程序中在哪里转换数据 - 在 Express 中还是在前端使用 React?

存储在 plist 中的数据在模拟器中有效,但在设备中无效

如何在保存在 Mongoose (ExpressJS) 之前在模型中格式化数据

如何在保存在 Mongoose (ExpressJS) 之前在模型中格式化数据