关于 iOS 辅助功能。如何将焦点转移到pickerView

Posted

技术标签:

【中文标题】关于 iOS 辅助功能。如何将焦点转移到pickerView【英文标题】:About iOS Accessibility. How to transfer focus to pickerView 【发布时间】:2015-12-03 22:12:35 【问题描述】:

我有一个带有 PickerView 的 inputView 的 UITextfield。我想实现这一点,当用户双击 UITextfield 时,pickerView 会像默认一样以模态方式显示,并且可访问性的焦点从文本字段更改为 pickerView。这就是我现在的做法:

func textFieldDidBeginEditing(textField: UITextField) 
    let dispatchTime: dispatch_time_t = dispatch_time(DISPATCH_TIME_NOW, Int64(0.65 * Double(NSEC_PER_SEC)))
    dispatch_after(dispatchTime, dispatch_get_main_queue(), 
        UIAccessibilityPostNotification(UIAccessibilityLayoutChangedNotification, self.quantityPicker))

当用户双击 textField 并在延迟 0.65 秒后发送 UIAccessibilityLayoutChangedNotification 以专注于 pickerView 时,只会调用此委托。

那么问题是:

    我这里使用了延迟等待pickerView弹窗动画完成,但是如果能知道pickerView动画在某处完成并放上去会好很多

    UIAccessibilityPostNotification(UIAccessibilityLayoutChangedNotification, self.quantityPicker)

那里。那么是否有任何委托或其他简单的方法可以知道 pickerView 已准备好使用?

    当我双击 textField 时,它会先读取 textField 的内容,直到被拦截。有没有办法禁用它以使它像:当我单击按钮时,读取accessibilityLabel、特征、提示等,当我双击它时,它什么也不读,只是做它的工作。

【问题讨论】:

【参考方案1】:

您可以使用通知中心事件 UIKeyboardDidShowNotification。在承载 UITextField 的视图控制器中,将代码添加到 viewWillAppear 方法:

NSNotificationCenter.defaultCenter().addObserver(self, 
                       selector: #selector(self.keyboardDidShow(_:)), 
                       name: UIKeyboardDidShowNotification, 
                       object: nil)

在 viewWillDisappear 方法中添加:

NSNotificationCenter.defaultCenter().removeObserver(self)

然后添加一个方法keyboardDidShow:

func keyboardDidShow(notification:NSNotification) 
    UIAccessibilityPostNotification(UIAccessibilityLayoutChangedNotification, self.quantityPicker)

当然,如果您的视图控制器中有其他输入字段,您需要向keyboardDidShow 添加一些条件代码。

经过测试和工作。谢谢你的问题,我一直在追同样的问题。

【讨论】:

【参考方案2】:

如果您将视图显示为单独的模态视图控制器的一部分,则可以使用 viewDidAppear 方法作为您要查找的回调。

-(void)viewDidAppear:(BOOL)animated 
    UIAccessibilityPostNotification(UIAccessibilityLayoutChangedNotification, outletOfViewYouWantFocused);

【讨论】:

嘿克里斯!再次感谢您的回复!你能告诉我如何检查我正在寻找的视图是否存在于视图层次结构中,因为它是 textField 的 inputView 并且在你点击 textField 后所有操作都会自动完成?我们在某处有完成块吗? 如果这很困难,另一种解决方案可能会更好。【参考方案3】:

@Dale 在 Swift 4 中的回答:

viewWillAppear

NotificationCenter.default.addObserver(self, selector: #selector(keyboardDidShow(notification:)), name: UIResponder.keyboardDidShowNotification, object: nil)

viewWillDisappear

NotificationCenter.default.removeObserver(self)

keyboardDidShow

@objc func keyboardDidShow(notification: Notification) 
    UIAccessibility.post(notification: .layoutChanged, argument: self.quantityPicker)
  

【讨论】:

以上是关于关于 iOS 辅助功能。如何将焦点转移到pickerView的主要内容,如果未能解决你的问题,请参考以下文章

辅助功能将焦点设置到导航栏标题项

如何让语音焦点集中在我的模态中?

将辅助功能画外音光标焦点移动到特定元素

UIAccessibility - 当关闭另一个视图时,将焦点设置到上一个辅助功能元素

在将焦点转移到某个元素之前,如何等待公告完成?

iCarousel - 如何将焦点转移到左侧