在 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 相对于键盘的垂直偏移,而不是调整其框架。