在 UITextField 中插入文本后不需要的 UIView 框架重置
Unwanted UIView frame reset after inserting text in UITextField
我遇到了一些有趣的问题,运行 不知道如何解决它。
在我的一个控制器中,我使用了一种根据键盘外观调整视图框架的简单方案运行ce.
在 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
重置到没有动画的原始位置。
问题是真正导致这种行为的原因是什么?我完全困惑并检查了可能影响此的任何事情。请帮忙!!!
请确保:
一个。你的 contentView
没有附加任何布局约束,否则当你设置它的框架时,它的框架将在下一个布局传递时重置为约束所说的框架应该是什么。
或:
乙。使用约束来定位 contentView
相对于键盘的垂直偏移,而不是调整其框架。
我遇到了一些有趣的问题,运行 不知道如何解决它。 在我的一个控制器中,我使用了一种根据键盘外观调整视图框架的简单方案运行ce.
在 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
重置到没有动画的原始位置。
问题是真正导致这种行为的原因是什么?我完全困惑并检查了可能影响此的任何事情。请帮忙!!!
请确保:
一个。你的 contentView
没有附加任何布局约束,否则当你设置它的框架时,它的框架将在下一个布局传递时重置为约束所说的框架应该是什么。
或:
乙。使用约束来定位 contentView
相对于键盘的垂直偏移,而不是调整其框架。