Клавиатура iOS скрывает UITextField

Когда я нажимаю на UITextField в нижней части экрана, он скрывается клавиатурой. Что я хотел сделать, так это переместиться вверх со стандартной анимацией iOS, достигнув UITextField того, в который я вставляю текст. Я разрабатываю приложение в Swift 5 (Xcode 10.2)

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

class ViewController: UIViewController {
    deinit {
        NotificationCenter.default.removeObserver(self)
    }

    override func viewDidLoad() {
        super.viewDidLoad()

        NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillShow(notification:)), name: UIResponder.keyboardWillShowNotification, object: nil)
        NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillHide(notification:)), name: UIResponder.keyboardWillHideNotification, object: nil)
    }

    @objc func keyboardWillShow(notification: NSNotification) {
        guard let userInfo = notification.userInfo else {
            return
        }

        guard let keyboardSize = userInfo[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue else {
            return
        }

        let keyboardFrame = keyboardSize.cgRectValue

        if self.view.frame.origin.y == 0 {
            self.view.frame.origin.y -= keyboardFrame.height
        }
    }

    @objc func keyboardWillHide(notification: NSNotification) {
        guard let userInfo = notification.userInfo else {
            return
        }

        guard let keyboardSize = userInfo[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue else {
            return
        }

        let keyboardFrame = keyboardSize.cgRectValue

        if self.view.frame.origin.y != 0 {
            self.view.frame.origin.y += keyboardFrame.height
        }
    }
}

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

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


person vFeder6    schedule 11.04.2019    source источник
comment
Попробуйте это: stackoverflow.com/questions/55561143/   -  person Razi Tiwana    schedule 11.04.2019
comment
@RaziTiwana спасибо, то, что вы разместили в первом комментарии, работает, но добавляет больше функций, которые мне, честно говоря, не нужны. Второй комментарий сообщает о чем-то в Objective-C, чего я не понимаю, и относится к старой версии iOS.   -  person vFeder6    schedule 12.04.2019
comment
Является ли дополнительная панель инструментов единственной проблемой, связанной с первой? ведь это можно убрать.   -  person Razi Tiwana    schedule 12.04.2019
comment
Вы проверили в func keyboardWillShow (уведомление: NSNotification) {} то, какое текстовое поле начинается с редактирования, если текстовое поле находится внизу, то перемещайте вид только вверх.   -  person Nikhil Nandha    schedule 12.04.2019


Ответы (1)


вы можете попробовать, взяв scrollview :

import UIKit

class ViewController: UIViewController {

    @IBOutlet var scrollView: UIScrollView!


    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.

        NotificationCenter.default.addObserver(self,selector:#selector(self.keyboardWillShow),name:UIResponder.keyboardDidShowNotification, object: nil)
        NotificationCenter.default.addObserver(self,selector: #selector(self.keyboardWillHide),name:UIResponder.keyboardDidHideNotification, object: nil)

    }

    @objc func keyboardWillShow(notification: Notification) {

        guard let userInfo = notification.userInfo,

            let frame = (userInfo[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue
            else{
                return

        }

        let contentInset = UIEdgeInsets(top: 0, left: 0, bottom: frame.height, right: 0)

        scrollView.contentInset = contentInset

    }

    @objc func keyboardWillHide(notification: Notification)

    {
        scrollView.contentInset = UIEdgeInsets.zero
    }

}
person Santosh Kumar J M    schedule 12.04.2019
comment
У меня есть все мои элементы в стеке. Возможно ли программно добавить прокрутку? я не могу найти способ - person vFeder6; 13.04.2019
comment
@ vFeder6 я никогда не пробовал прокрутку программно. но вы можете встроить представление стека ur с помощью scrollview. - person Santosh Kumar J M; 15.04.2019
comment
Я пробовал с просмотром прокрутки, и это работает. Теперь у меня другая проблема. Когда я перехожу от одного TextField к другому, уведомление keyboardWillShow не поднимается, поэтому у меня такая же проблема, но когда клавиатура уже отображается. Могу ли я обновить основной вопрос с решением и задать другой вопрос? - person vFeder6; 21.04.2019