Как переместить изменение вида по оси Y при появлении клавиатуры

#swift #keyboard #uitextfield #nsnotificationcenter

#swift #клавиатура #uitextfield #nsnotificationcenter

Вопрос:

Я использую следующие функции, одна из которых изменяет ось Y всякий раз, когда появляется клавиатура, другая функция заключается в том, что если вы нажмете в любом месте представления, клавиатура исчезнет, и рамка должна вернуться в исходное положение.

Я использую firestore, поэтому, когда я запускаю приложение, я использую firestore Auth, чтобы проверить, вошел ли пользователь в систему, если пользователь не вошел в систему, отображается страница входа, после входа в систему страница входа закрывается, и вы возвращаетесь к корневому контроллеру, вам отображается вкладка стри вкладки, каждая вкладка подключена к отдельному контроллеру представления, и каждая из них помещается в навигационный контроллер.

На первой вкладке отображается контроллер представления с табличным представлением, в котором отображаются все мои контакты, затем я нажимаю на ячейку, которая приводит меня к моему контроллеру представления сообщений, где я могу отправлять и получать сообщения.

В моем контроллере представления сообщений в viewWillAppear я установил для панели вкладок значение true, а затем установил для моего UITextView значение в нижней части контроллера представления

Предполагается, что при нажатии на UITextView UITextView должен перемещаться вверх при появлении клавиатуры,

Я использую ту же функцию, но вместо этого происходит то, что клавиатура появляется и закрывает UITextView,

затем, когда я нажимаю на основной вид, чтобы отключить клавиатуру, клавиатура исчезает, но затем рамка перемещается вверх, но также не имеет смысла, как она перемещается на определенное расстояние, потому что она не перемещается туда, где она должна была быть, тогда я подумал, что, возможно, она перемещается к центру экрана.высота панели вкладок, но не делает этого, она находится где-то посередине

Что мне трудно понять, так это то, что я также пробовал, когда вы нажимаете на ячейку контакта вместо того, чтобы помещать контроллер представления сообщений в стек навигации, который я использовал, присутствует, когда я делаю это, он работает отлично, но мне бы очень хотелось, чтобы контроллер сообщений находился в стеке навигации, чтобыя могу легко вернуться назад

Любые отзывы будут оценены

     func keyboardNotifications() {
        
        NotificationCenter.default.addObserver(self, selector: #selector(self.keyboardWillShow), name: UIResponder.keyboardWillShowNotification, object: nil)
        NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillHide), name: UIResponder.keyboardWillHideNotification, object: nil)
    }
    
    
    @objc func keyboardWillShow(notification: NSNotification) {
        if let keyboardSize = (notification.userInfo?[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue {
            if self.view.frame.origin.y == 0 {
                self.view.frame.origin.y -= keyboardSize.height
            }
        }
    }
    
    
    @objc func keyboardWillHide(notification: NSNotification) {
        if self.view.frame.origin.y != 0 {
            self.view.frame.origin.y = 0
        }
    }
     
  

Ответ №1:

Вы можете использовать приведенный ниже код. Примечание: bottomConstraint является ли нижнее ограничение представления, содержащего текстовое представление

  override func viewDidLoad() {
        super.viewDidLoad()
        
       . 
       . 
       .
        NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillShow), name: UIResponder.keyboardWillShowNotification, object: nil)
        NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillHide), name: UIResponder.keyboardWillHideNotification, object: nil)
        NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillChangeFrame), name: UIResponder.keyboardWillChangeFrameNotification, object: nil)
    }
    
    
    @objc func keyboardWillShow(_ notification:Notification) {
        adjustingHeight(true, notification: notification)
    }
    
    @objc func keyboardWillHide(_ notification:Notification) {
        adjustingHeight(false, notification: notification)
    }
    
    @objc func keyboardWillChangeFrame(_ notification: Notification) {
        adjustingHeight(false, notification: notification)
    }
    
    func adjustingHeight(_ show:Bool, notification:Notification) {
        
        var userInfo = (notification as NSNotification).userInfo!
        let keyboardFrame:CGRect = (userInfo[UIResponder.keyboardFrameEndUserInfoKey] as! NSValue).cgRectValue
        let animationDurarion = userInfo[UIResponder.keyboardAnimationDurationUserInfoKey] as! TimeInterval
        let changeInHeight = (keyboardFrame.height ) * (show ? 1 : 0)
        self.bottomConstraint.constant = changeInHeight
        
        UIView.animate(withDuration: animationDurarion, animations: { () -> Void in
            self.view.layoutIfNeeded()
        })
    }