ios - 如何防止 VoiceOver 允许与隐藏的 UIDatePicker 交互

标签 ios objective-c uitableview uidatepicker voiceover

我在 UITableView 中实现了一个内联 UIDatePicker 就像它们出现在其他 iOS 应用程序中一样,例如在日历中创建新事件时。

在将应用程序与 VoiceOver 结合使用时,在用户选择日期然后在表格 View 单元格上双击关闭日期选择器后,日期选择器仍然可用。当日期选择器隐藏时,VoiceOver 突出显示相应的单元格,但如果用户随后向右滑动,它将选择现在隐藏的 UIDatePicker 并允许他们与之交互。我希望它能像在日历中那样选择下一个表格 View 单元格。

我读过其他关于隐藏 View 仍然可以访问的 SO 问题,为了防止这种情况发生,您可以将属性 accessibilityElementsHidden 设置为 YES隐藏元素后的容器 View ,让 VoiceOver 知道它不再出现在屏幕上。但这对我不起作用。我还读到您应该发布布局更改通知,以便 VoiceOver 知道更新到当前 UI,但这也没有用,隐藏的 View 仍然可以访问。

如何防止我隐藏的 UIDatePicker 被访问? 请注意,当表格加载时,隐藏的日期选择器不可访问。所以只有在它出现然后隐藏之后它仍然可以访问。

这是我的代码,用于在用户点击单元格时隐藏日期选择器:

self.datePicker.hidden = YES;
self.datePicker.alpha = 0.0f;
self.datePickerCell.accessibilityElementsHidden = YES;
self.datePickerCell.contentView.accessibilityElementsHidden = YES;
UIAccessibilityPostNotification(UIAccessibilityLayoutChangedNotification, nil);

并且在 heightForRowAtIndexPath 中,datePickerCell 高度在隐藏时更改为 0。请注意,datePickerdatePickerCellsubview

enter image description here

最佳答案

我尝试自己复制您的场景,并想出了一些与辅助功能配合得很好的东西。在我看来,最重要的决定是使用 NSLayoutConstraint 作为日期选择器的高度。

这是我设计的 Storyboard 的概览:

Static Tableview Storyboard

这就是我在 ViewController 中所做的:

@IBOutlet weak var pickerHeightConstraint: NSLayoutConstraint!
var showPicker = false
@IBOutlet weak var datePickerView: UIDatePicker!

override func viewDidLoad() {
    super.viewDidLoad()
    pickerHeightConstraint.constant = 0
}

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    if indexPath.row == 0 {
        showPicker = !showPicker
        datePickerView.alpha = showPicker ? 1.0 : 0.0
        pickerHeightConstraint.constant = showPicker ? 224 : 0
        tableView.beginUpdates()
        tableView.endUpdates()
    }
}

override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
    if indexPath.row == 1 {
        return pickerHeightConstraint.constant
    }
    return UITableViewAutomaticDimension
}

请注意,我不必乱用 UIAccessibility 属性,例如 accessibilityElementsHidden。只需使用 Layout Constraint 的 constant 属性来操作日期选择器 View 元素。

你可以找到我测试过的项目 here .可以在 README 中找到 Gif,因此您可以快速查看简短的演示 - 我的声誉不足以提供更多链接。

关于ios - 如何防止 VoiceOver 允许与隐藏的 UIDatePicker 交互,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24745881/

相关文章:

ios - 核心文本中的垂直文本对齐

ios - Pages 和 Keynote URL Scheme

objective-c - Objective-C - UICollectionView 左侧/右侧的渐变渐变

ios - 将 UISearchBar 作为 subview 添加到 tableView header 中

ios - 在 TableViewCell 中设置纵横比的多个圆形 UIImageView 的自动布局

ios - SKTextureAtlas:不止一个图集令人困惑

ios - 如何使用 Storyboard在自定义 uitableview 中为 5 个 UILabel 系列提供约束?

iphone - editStyleForRowAtIndexPath 没有被调用(因此显示删除按钮)

objective-c - UITextView:我必须总是 resignFirstResponder 吗?

ios - 如何在Objective-C中找到MATH函数的cos-1(-0.6481){cos inverse}?