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

Ke *_* MA 4 accessibility uipickerview uitextfield ios voiceover

我有一个带有 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)})
}
Run Code Online (Sandbox Code Playgroud)

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

那么问题是:

  1. 我在这里使用了一个延迟来等待pickerView弹出动画完成,但如果我能知道pickerView动画在某处完成并放置会更好

    UIAccessibilityPostNotification(UIAccessibilityLayoutChangedNotification, self.quantityPicker)

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

  1. 当我双击 textField 时,它会首先读取 textField 的内容,直到它被拦截。无论如何要禁用它以使其像:当我单击按钮时,读取可访问性标签,特征,提示等,当我双击它时,它什么也不读,只是完成它的工作。

Dal*_*ale 5

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

NSNotificationCenter.defaultCenter().addObserver(self, 
                       selector: #selector(self.keyboardDidShow(_:)), 
                       name: UIKeyboardDidShowNotification, 
                       object: nil)
Run Code Online (Sandbox Code Playgroud)

在 viewWillDisappear 方法中添加:

NSNotificationCenter.defaultCenter().removeObserver(self)
Run Code Online (Sandbox Code Playgroud)

然后添加一个方法keyboardDidShow:

func keyboardDidShow(notification:NSNotification) {
    UIAccessibilityPostNotification(UIAccessibilityLayoutChangedNotification, self.quantityPicker)
}
Run Code Online (Sandbox Code Playgroud)

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

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