我被一些有趣的问题卡住了,没办法解决了。在我的一个控制器中,我使用了一个简单的方案,根据键盘的外观调整视图框架。
在我的一个控制器中,我使用了一个简单的方案,根据键盘的外观来调整视图框。UITextFieldDelegate
方法,我初始化控制器的属性 firstResponder
:
func textFieldDidBeginEditing(_ textField: UITextField) {
self.firstResponder = textField
}
然后,我使用UIKeyboard通知选择器来改变框架。contentView
:
override func keyboardWillShow(_ notifications: Notification) {
super.keyboardWillShow(notifications)
let info = notifications.userInfo
let keyboardFrame:CGRect = (info![UIKeyboardFrameEndUserInfoKey] as! NSValue).cgRectValue
let duration:Double = (info![UIKeyboardAnimationDurationUserInfoKey] as! NSNumber).doubleValue
var bottomY:CGFloat!
if self.firstResponder == self.emailTextField{
bottomY = self.emailBottomLine.frame.origin.y + 80 + self.headerView.frame.height
}
else {
return
}
if bottomY >= keyboardFrame.origin.y {
let offset = bottomY - keyboardFrame.origin.y
UIView.animate(withDuration: duration, animations: {
self.contentView.frame.origin.y = -offset
})
}else{
UIView.animate(withDuration: duration, animations: {
self.contentView.frame.origin.y = self.contentViewOriginY
})
}
}
override func keyboardWillHide(_ notifications: Notification) {
super.keyboardWillHide(notifications)
let info = notifications.userInfo
let duration:Double = (info![UIKeyboardAnimationDurationUserInfoKey] as! NSNumber).doubleValue
UIView.animate(withDuration: duration, animations: {
self.contentView.frame.origin.y = self.contentViewOriginY
})
}
一切都很好,直到我开始在里面打字。emailTextField
. 每次敲击键盘都会导致 contentView
重置到原来的位置,没有动画。
问题是到底是什么原因导致这种行为?我完全糊涂了,已经检查了任何可能影响这个的东西。请帮助我!!!
确保无论是。
A. 你的 contentView
没有附加任何布局约束,否则当你设置它的框架时,它的框架将在下一次布局传递中被重置回约束条件所规定的框架。
或。
B. 使用约束条件来定位你的 contentView
的相对于键盘的垂直偏移,而不是调整其框架。