动画一个 `inputView` 键盘转换

Posted

技术标签:

【中文标题】动画一个 `inputView` 键盘转换【英文标题】:Animating an `inputView` Keyboard Transition 【发布时间】:2015-01-14 17:39:54 【问题描述】:

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

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

我希望能够在两种不同的输入方式之间切换。触发此操作的接口将是安装为UITextFieldinputAccessoryViewUISegmentedView

我已经完成了这项工作,但过渡非常突然。部分原因是我在 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,因为这个视图是作为UITextFieldinputAccessoryView 安装的,它最终嵌套在键盘窗口下。)

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

有什么想法吗?谢谢!

【问题讨论】:

【参考方案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 的子视图,然后 在您选择动画完成后,将UIControlinputView 切换为自定义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 后显示键盘

了解 inputView 和 firstResponder:如何创建一个将 UIDatePicker 显示为键盘的 UITableViewCell?

适用于iPhone X的自定义键盘inputView.frame大小

ios添加自定义inputView

新浪微博客户端(41)-切换表情键盘

如何为输入附件视图的高度设置动画?