首页 > 解决方案 > UIView 在显示键盘时出现,但在我开始输入时消失(swift)?

问题描述

我有一个UIView装有 aUITextField和两个的容器UIButtons(见下图)。

我写了一个extension监听UIKeyboardWillShow通知并动画, UIView以便它在显示时绑定到键盘。

这非常有效,但是一旦我开始输入,它就会UIView再次消失。

扩展用法:

sendMessageView.bindToKeyboard()

UIView 扩展:

extension UIView {

    func bindToKeyboard() {

        NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillShow), name: NSNotification.Name.UIKeyboardWillShow, object: nil)

    }//end func

    @objc func keyboardWillShow(notification: NSNotification) {

        let duration = notification.userInfo![UIKeyboardAnimationDurationUserInfoKey] as! Double

        let curve = notification.userInfo![UIKeyboardAnimationCurveUserInfoKey] as! UInt

        let beginningFrame = (notification.userInfo![UIKeyboardFrameBeginUserInfoKey] as! NSValue).cgRectValue

        let endFrame = (notification.userInfo![UIKeyboardFrameEndUserInfoKey] as! NSValue).cgRectValue

        let deltaY = endFrame.origin.y - beginningFrame.origin.y


        UIView.animateKeyframes(withDuration: duration, delay: 0.0, options: UIViewKeyframeAnimationOptions(rawValue: curve), animations: {
            self.frame.origin.y += deltaY
        }, completion: nil)

    }//end func

}//end extension

UIView 在显示时绑定到键盘:

在此处输入图像描述

键入时 UIView 消失(我怀疑在键盘后面到其原始位置):

在此处输入图像描述

标签: iosswiftuiview

解决方案


不要为 UIView 本身添加扩展名。只需将您的 textBox 视图添加为子视图,并将视图的底部约束设置为根据键盘的高度进行更新。如果键盘存在,则将常量设置为键盘高度的负值,否则将其设置为零。

    private func setupView() {
        NotificationCenter.default.addObserver(self, selector: #selector(keyBoardShown(_:)), name: UIResponder.keyboardWillShowNotification, object: nil)
        self.view.backgroundColor = .white
        self.view.addSubview(textInputView)
        bottomConstraint = NSLayoutConstraint(item: textInputView, attribute: .bottom, relatedBy: .equal, toItem: view.safeAreaLayoutGuide, attribute: .bottom, multiplier: 1.0, constant: 0)
        NSLayoutConstraint.activate([
            //textBox.bottomAnchor.constraint(equalTo: view.bottomAnchor, constant: 0),
            //textInputView.heightAnchor.constraint(equalToConstant: UIFont.systemFontSize+14+10),
            textInputView.leadingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.leadingAnchor, constant: 0),
            textInputView.trailingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.trailingAnchor, constant: 0)
        ])
        bottomConstraint.isActive = true
    }

    @objc private func keyBoardShown(_ notification: NSNotification) {
        if let keyboardSize = (notification.userInfo?[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue {
            print(keyboardSize.height)
            bottomConstraint.constant = -keyboardSize.height
            UIView.animate(withDuration: 0.5,
                           delay: TimeInterval(0),
                           options: .beginFromCurrentState,
                           animations: { self.view.layoutIfNeeded() },
                           completion: nil)
        }
    }

推荐阅读