ios - 动画 `inputView` 键盘转换

标签 ios uitextfield uiviewanimation uiviewanimationtransition

UITextField 有一个 inputView可用于指定自定义键盘的属性。将此项清除为 nil 可提供默认键盘。

如果 UITextField 是第一响应者,则设置 inputView 不会发生任何变化,但会调用 [textField reloadInputView]键盘更改将立即发生。

我希望能够在两种不同的输入方法之间切换。触发此操作的界面将是作为 UITextFieldinputAccessoryView 安装的 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/

相关文章:

objective-c - 在 iPhone 的 UITextField 中验证电子邮件地址

UITableViewController 不响应键盘

ios - Ios开发中的定时动画

ios - 使用每个新条目将新条目添加到表格顶部的表格 View Controller

ios - 可以在 Xcode 6.0.1 中使用模拟器 6.1 吗?

ios - 使用 Interface Builder 关闭 UITextField 上的键盘

ios - 享受 UIView 动画和 UIView 翻转的乐趣

iphone - 从不同的 View Controller 调用时,UIView 动画不会触发?

ios - 设置应用程序的默认iOS本地通知样式

ios - 仪器[34247 :1345307] Attempting to set event horizon when core is not engaged,请求被忽略