【问题标题】:How to prevent VoiceOver allowing interaction with hidden UIDatePicker如何防止 VoiceOver 允许与隐藏的 UIDatePicker 交互
【发布时间】:2014-07-14 20:59:44
【问题描述】:

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

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

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

如何防止我隐藏的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。请注意,datePickersubviewdatePickerCell

【问题讨论】:

  • 但是如果用户向右滑动”是什么意思?此操作是否会打开另一个窗口(例如在导航控制器中 - 弹出当前窗口)?
  • @AleksandrMedvedev 不,在 VoiceOver 活动的情况下滑动会将突出显示切换到下一个元素。
  • 你用的是静态还是动态的tableview?
  • @AleksandrMedvedev 静态

标签: ios objective-c uitableview uidatepicker voiceover


【解决方案1】:

我尝试自己复制您的场景,并想出了一些与可访问性配合得很好的东西。我认为最重要的决定是使用 NSLayoutConstraint 作为日期选择器的高度。

这是我设计的故事板的概述:

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
}

请注意,我不必弄乱诸如accessibilityElementsHidden 之类的 UIAccessibility 属性。只需使用布局约束的 constant 属性来操作日期选择器视图元素。

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

【讨论】:

    【解决方案2】:
    self.datePicker.isAccessibilityElement = FALSE;
    

    这应该从辅助功能中隐藏它。

    【讨论】:

    • 不幸的是,这并没有成功 - 仍然可以访问。
    【解决方案3】:

    删除日期选择器或使用另一个没有日期选择器的单元格

    【讨论】:

      【解决方案4】:

      我建议你检查一个变量是否可以访问,所以:

      @property(nonatomic,assign) BOOL isAccessible;
      

      并且在 viewDidLoad 中设置属性为accessible = NO;

      self.isAccessible = NO;
      

      UITableViewDelegate

      -(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(nonnull NSIndexPath *)indexPath
      {
          if(self.isAccessible)
          {
            //Do your date picker functionality
          }
          //For else u dont need cuz it will do no function if isAccessible is set to NO;
      }
      

      【讨论】:

        猜你喜欢
        • 2015-02-25
        • 1970-01-01
        • 2019-09-25
        • 1970-01-01
        • 2020-11-17
        • 1970-01-01
        • 1970-01-01
        • 2016-10-03
        • 1970-01-01
        相关资源
        最近更新 更多