如何在显示视图的同时显示键盘并向上移动UIView?

时间:2020-07-08 04:19:51

标签: ios swift uiview uitextfield uiresponder

我已经使用包含文本字段的UIView创建了一个视图控制器(注意:该视图控制器以模式形式出现)。当您点击文本字段时,将出现一个键盘,并且UIView将在屏幕上移动,以使文本字段不会被遮盖。但是,我的目标是在模式最初出现时从一开始就显示键盘和(未模糊的)UIView。

我尝试将textField.becomeFirstResponder()插入viewDidLoad中,但是这显示了键盘,而没有将UIView移至所需的位置(即可见位置)。我也尝试将其插入到viewDidAppear中,但是在显示键盘并在非常尴尬的过渡中向上移动UIView之前,它将首先显示UIView,然后停顿一秒钟。

如果有人可以提供一些解决此问题的建议,那就太好了。我的代码在下面。

@IBOutlet var textField: UITextField!

override func viewDidLoad() {
    super.viewDidLoad()
    view.backgroundColor = .darkGray
    
    NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillShow), name: UIResponder.keyboardWillShowNotification, object: nil)
    //The line below will display the keyboard over the UIView, thus obscuring it.
    textField.becomeFirstResponder()
}

@objc func keyboardWillShow(_ notification: Notification) {
    if let keyboardFrame: NSValue = notification.userInfo?[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue {
        let keyboardRectangle = keyboardFrame.cgRectValue
        let keyboardHeight = keyboardRectangle.height
    }
    let keyboardSize = (notification.userInfo?[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue
    self.view.frame.origin.y = 0 - keyboardSize!.height
}

下面是视觉参考。

enter image description here

2 个答案:

答案 0 :(得分:0)

您可以添加动画块以使视图更好看,还需要匹配键盘动画的速度,如下所示:

        if let duration = notification.userInfo?[UIResponder.keyboardAnimationDurationUserInfoKey] as? Double {
            UIView.animate(withDuration: duration, animations: { [weak self] in
                self?.view.layoutIfNeeded()
            })
        }

这应该添加到您的KeyboardWillShow函数的末尾。

如果将textField.becomeFirstResponder()移到viewWillAppear,也许会更好。

答案 1 :(得分:0)

引用(IBOutlet)视图的底部约束,将其命名为bottomConstraint或您喜欢的任何名称。

然后按照您在keyboardWillShow选择器中所做的操作,提取键盘高度,并将该高度分配给constant的{​​{1}}属性。如果需要,可以添加动画。

bottomConstraint

enter image description here

相关问题