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];
(在第二个代码块中,我从self.window获得了keyboardWindow,因为这个视图是作为UITextField的inputAccessoryView安装的,它最终嵌套在键盘的窗口下.)
我想要的是动画和转换输入视图重新加载.我尝试将重新加载放在动画的过渡中,我也尝试将重新加载放在过渡中的动画中 – 似乎都没有帮助.
有任何想法吗?谢谢!
解决方法
我能够通过以下方式成功动画对inputView的更改,而不会出现任何故障:
>将新的inputView添加为现有inputView的子视图,然后再添加
>在完成动画选择后,将UIControl的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; }];