UITextField
有一个 inputView
可用于指定自定义键盘的属性。将此项清除为 nil
可提供默认键盘。
如果 UITextField
是第一响应者,则设置 inputView
不会发生任何变化,但会调用 [textField reloadInputView]
键盘更改将立即发生。
我希望能够在两种不同的输入方法之间切换。触发此操作的界面将是作为 UITextField
的 inputAccessoryView
安装的 UISegmentedView
。
我已经开始工作了,但是转换非常突然。部分原因是我在 iPad 上切换的微调器和键盘尺寸不同。
我发现我在 reloadInputView
周围包裹了一个动画 block ,我将在两个键盘的 View 框架之间获得平滑的动画。不幸的是,由于过渡不是动画的,因此存在视觉抖动:
[UIView animateWithDuration: 0.3 animations:^()
{
[firstResponder reloadInputViews];
}];
或者,如果我将重新加载包装在一个过渡中,我可以获得很好的交叉淡入淡出效果,但我不会获得平滑的帧变化:
[UIView transitionWithView: keyboardWindow
duration: 0.3
options: UIViewAnimationOptionTransitionCrossDissolve
animations: ^(){ [firstResponder reloadInputViews]; }
completion: nil];
(在第二个代码块中,我从 self.window
获得了 keyboardWindow
,因为这个 View 是作为 UITextField
的 安装的inputAccessoryView
最终嵌套在键盘窗口下。)
我想要的是动画和 转换输入 View 重新加载。我尝试将重载放置在动画的过渡中,我还尝试将重新加载放置在过渡的动画中 – 似乎都没有帮助。
有什么想法吗?谢谢!
最佳答案
您可以调用 resignFirstResponder
使输入 View 消失,然后在延迟后调用 becomeFirstResponder
使键盘出现,反之亦然。
下面在退出普通键盘后设置为inputView。
let delayTime = dispatch_time(DISPATCH_TIME_NOW,Int64(1 * (NSEC_PER_SEC/3)))
textField.resignFirstResponder()
dispatch_after(delayTime, dispatch_get_main_queue()) {
self.textField.inputView = currentInputView
self.textField.becomeFirstResponder()
}
这设置为键盘。
dispatch_after(delayTime, dispatch_get_main_queue()) {
self.textField.inputView = nil
self.textField.becomeFirstResponder()
}
关于ios - 动画 `inputView` 键盘转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27949105/