Как отображать клавиатуру и перемещаться вверх по UIView одновременно с отображением представления?

Я создал контроллер представления с 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
}

Ниже представлена ​​визуальная ссылка.

введите здесь описание изображения


person safetotry    schedule 08.07.2020    source источник


Ответы (2)


Сделайте ссылку (IBOutlet) нижнего ограничения вашего представления, назовите его как bottomConstraint или как вам больше нравится.

Затем, как вы делаете в своем селекторе keyboardWillShow, извлеките высоту клавиатуры и назначьте эту высоту свойству constant вашего bottomConstraint. Добавьте анимацию, если хотите.

import UIKit

class SecondViewController: UIViewController {

    @IBOutlet var textField: UITextField!
    @IBOutlet weak var bottomConstraint: NSLayoutConstraint!
    
    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) {
        let info = notification.userInfo!
        let kbHeight = (info[UIResponder.keyboardFrameEndUserInfoKey] as! NSValue).cgRectValue.height
        
        bottomConstraint.constant = -kbHeight
        
        let duration: TimeInterval = (info[UIResponder.keyboardAnimationDurationUserInfoKey] as! NSNumber).doubleValue
        
        UIView.animate(withDuration: duration) { self.view.layoutIfNeeded() }
    }
}

введите здесь описание изображения

person Glenn Posadas    schedule 09.07.2020

Вы можете добавить блок анимации, чтобы ваш вид выглядел лучше, также вам нужно будет соответствовать скорости анимации клавиатуры, например:

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

Это должно быть добавлено в конце вашей функции keyboardWillShow.

Также может быть лучше, если вы переместите textField.becomeFirstResponder() в представлениеWillAppear.

person Hossam Sherif    schedule 08.07.2020
comment
Спасибо за ответ, Хоссам. Я пытался реализовать ваши предложения, но клавиатура по-прежнему появляется, чтобы закрыть UIVIew, когда появляется модальное окно. - person safetotry; 08.07.2020