动画`inputView`键盘转换

时间:2015-01-14 17:39:54

标签: ios uitextfield uiviewanimation uiviewanimationtransition

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}}下键盘的窗口。)

我想要的是动画过渡输入视图重新加载。我尝试将重新加载放在动画中的转换中,我也尝试将重新加载放在转换中的动画中 - 似乎没有帮助。

有什么想法吗?谢谢!

2 个答案:

答案 0 :(得分:1)

我能够在没有任何故障的情况下成功动画inputView的动画:

  1. 将新inputView添加为现有inputView的子视图,然后添加
  2. 完成您选择的动画后,将UIControl' inputView切换为自定义inputView
  3. 例如,以下是如何快速淡入自定义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()
}