在我的应用程序中,我有一个包含三个文本字段的UIView:
名字,姓氏,出生日期。
名称字段并排在一行" line"并且DOB字段位于"线"低于它。
当键盘打开或关闭时,视图控制器会向上或向下滑动以确保字段不会被覆盖。当键盘保持打开状态时,我可以从名字切换到姓氏而无需额外滑动。但是,出生日期设置为显示UIDatePicker而不是键盘。当用户从任一名称字段移动到日期字段时,键盘切换到日期选择器但不执行" keyboardWillHide"功能。然而,它将执行" keyboardWillShow"新日期选择器的功能,从而再次向上滑动视图控制器。
由于此问题,页面顶部的任何内容都会滚出视图而无法将其取回,除非重新启动应用,或者在viewWillAppear / Disappear上重置VC的原始坐标。
这是我的代码在滑动时的样子:
func keyboardWillShow(notification: NSNotification) {
if let userInfo = notification.userInfo {
if let keyboardSize = (userInfo[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.CGRectValue() {
kbHeight = keyboardSize.height
self.animateTextField(true)
}
}
}
func keyboardWillHide(notification: NSNotification) {
self.animateTextField(false)
}
func animateTextField(up: Bool) {
var movementDistance = 80
var movementDuration = 0.3
var movement = CGFloat(up ? -movementDistance : movementDistance)
UIView.beginAnimations("anim", context: nil)
UIView.setAnimationBeginsFromCurrentState(true)
UIView.setAnimationDuration(movementDuration)
self.view.frame = CGRectOffset(self.view.frame, 0, movement)
UIView.commitAnimations()
}
答案 0 :(得分:0)
我最终创建了一个跟踪变量来判断键盘何时打开和关闭。这样滑动功能仅在满足条件时执行。
我的动画功能新代码是:
func animateTextField(up: Bool) {
if(up) {
if(!keyboardIsOpen) {
var movementDistance = -80
var movementDuration = 0.3
var movement = CGFloat(movementDistance)
UIView.beginAnimations("anim", context: nil)
UIView.setAnimationBeginsFromCurrentState(true)
UIView.setAnimationDuration(movementDuration)
self.view.frame = CGRectOffset(self.view.frame, 0, movement)
UIView.commitAnimations()
keyboardIsOpen = true
}
}
else {
if(keyboardIsOpen) {
var movementDistance = 80
var movementDuration = 0.3
var movement = CGFloat(movementDistance)
UIView.beginAnimations("anim", context: nil)
UIView.setAnimationBeginsFromCurrentState(true)
UIView.setAnimationDuration(movementDuration)
self.view.frame = CGRectOffset(self.view.frame, 0, movement)
UIView.commitAnimations()
keyboardIsOpen = false
}
}
}
简单。