动画一个 `inputView` 键盘转换
Posted
技术标签:
【中文标题】动画一个 `inputView` 键盘转换【英文标题】:Animating an `inputView` Keyboard Transition 【发布时间】:2015-01-14 17:39:54 【问题描述】:UITextField
有一个inputView
属性,可用于指定自定义键盘。将此清除为 nil
会提供默认键盘。
如果UITextField
是第一响应者,则设置inputView
不会发生任何变化,但通过调用[textField reloadInputView]
,键盘会立即发生变化。
我希望能够在两种不同的输入方式之间切换。触发此操作的接口将是安装为UITextField
的inputAccessoryView
的UISegmentedView
。
我已经完成了这项工作,但过渡非常突然。部分原因是我在 iPad 上转换的微调器和键盘的尺寸不同。
我发现我在reloadInputView
周围包裹了一个动画块,我将在两个键盘的视图帧之间获得平滑的动画。不幸的是,由于过渡没有动画效果,因此存在视觉抖动:
[UIView animateWithDuration: 0.3 animations:^()
[firstResponder reloadInputViews];
];
或者,如果我将重新加载包装在一个过渡中,我可以获得一个很好的交叉淡入淡出,但我没有得到平滑的帧变化:
[UIView transitionWithView: keyboardWindow
duration: 0.3
options: UIViewAnimationOptionTransitionCrossDissolve
animations: ^() [firstResponder reloadInputViews];
completion: nil];
(在第二个代码块中,我从self.window
获得了keyboardWindow
,因为这个视图是作为UITextField
的inputAccessoryView
安装的,它最终嵌套在键盘窗口下。)
我想要动画和转换输入视图重新加载。我尝试将重新加载放置在动画的过渡中,我还尝试将重新加载放置在过渡中的动画中 - 似乎都没有帮助。
有什么想法吗?谢谢!
【问题讨论】:
【参考方案1】:您可以调用resignFirstResponder
使输入视图消失,然后在延迟后调用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()
【讨论】:
谢谢 - 我不想放弃隐藏键盘然后再次显示它。【参考方案2】:我能够成功地对inputView
进行动画更改,而不会出现任何故障:
-
添加新的
inputView
作为现有inputView
的子视图,然后
在您选择动画完成后,将UIControl
的inputView
切换为自定义inputView
。
例如,下面是如何快速淡入自定义inputView
:
//start the view as invisible
_customInputView.alpha = 0.0f;
//add the custom inputView as a subview of the existing inputView
[self.inputView addSubview:_customInputView];
//animate the opacity change
[UIView animateWithDuration:0.25f
delay:0.0f
options:UIViewAnimationOptionCurveEaseInOut
animations:^
_customInputView.alpha = 1.0f;
completion:^(BOOL finished)
//switch the UIControl's inputView
self.inputView = _customInputView;
];
【讨论】:
这听起来不错。谢谢。我目前无法对此进行测试,但是您可以从我那里得到 +1 :-)以上是关于动画一个 `inputView` 键盘转换的主要内容,如果未能解决你的问题,请参考以下文章
了解 inputView 和 firstResponder:如何创建一个将 UIDatePicker 显示为键盘的 UITableViewCell?