UITextField
具有inputView
属性,可用于指定自定义键盘。将其清除为nil
可提供默认键盘。
如果UITextField
是第一个响应者,则设置inputView
时不会发生任何变化,但通过调用[textField reloadInputView]
,键盘更改将立即发生。
我希望能够在两种不同的输入方法之间切换。触发此操作的界面将UISegmentedView
安装为UITextField
inputAccessoryView
。
我有这个工作,但过渡非常突然。部分原因是我在两者之间转换的微调器和键盘在iPad上有不同的尺寸。
我发现我在reloadInputView
周围包裹一个动画块,我会在两个键盘的视图帧之间得到一个平滑的动画。不幸的是,有一种视觉抖动,因为过渡不是动画:
[UIView animateWithDuration: 0.3 animations:^()
{
[firstResponder reloadInputViews];
}];
或者,如果我在转换中包装重新加载,我可以得到一个很好的交叉淡入淡出,但我没有得到平滑的帧更改:
[UIView transitionWithView: keyboardWindow
duration: 0.3
options: UIViewAnimationOptionTransitionCrossDissolve
animations: ^(){ [firstResponder reloadInputViews]; }
completion: nil];
(在我从keyboardWindow
获得self.window
的第二个代码块中,因为此视图安装为UITextField
' s inputAccessoryView
,最终嵌套在{{1}}下键盘的窗口。)
我想要的是动画和过渡输入视图重新加载。我尝试将重新加载放在动画中的转换中,我也尝试将重新加载放在转换中的动画中 - 似乎没有帮助。
有什么想法吗?谢谢!
答案 0 :(得分:1)
我能够在没有任何故障的情况下成功动画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 :(得分:0)
您可以调用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()
}