@uzolenta

Как вернуть размер экрана после прокрутки scroll view?

override func viewDidLoad() {
        super.viewDidLoad()

        NotificationCenter.default.addObserver(self, selector: #selector(KeyBoard), name: UIResponder.keyboardDidHideNotification, object: nil)
        NotificationCenter.default.addObserver(self, selector: #selector(KeyBoard), name: UIResponder.keyboardWillChangeFrameNotification, object: nil)

    }
    
    @objc func KeyBoard(notification: Notification){
        let userInfo = notification.userInfo!
        let keyBoardScreenEndFrame = (userInfo[UIResponder.keyboardFrameEndUserInfoKey] as! NSValue).cgRectValue
        let keyBoardViewEndFrame = view.convert(keyBoardScreenEndFrame, from: view.window)
        
        if notification.name == UIResponder.keyboardWillHideNotification{
            print("HIDE KEYBOARD")
            scrollView.contentInset = UIEdgeInsets.zero
        } else {
            scrollView.contentInset = UIEdgeInsets(top: 0, left: 0, bottom: keyBoardViewEndFrame.height, right: 0)    
        }
        scrollView.scrollIndicatorInsets = scrollView.contentInset
    }
    
    
    /*Close keyboard*/
    @IBAction func hideKeyBoard(_ sender: UITapGestureRecognizer) {
        view.endEditing(true)
        scrollView.contentInset = UIEdgeInsets.zero
        print("HIDE KEYBOARD2")
    }
    /*END Close keyboard*/


Вот так двигаю контент при открытии клавиатуры - все работает.
Но после закрытия клавиатуры добавляется пространство ниже первоначального экрана, на котором уже нет ScrollView. Как избавиться от добавленного размера (красный квадрат)?
Когда пролистывание вниз (тянуть экран вниз), то поле встает на свое первоначальное место и скролл работает на весь экран, а когда пролистываешь вверх, то появляется свободное место и скролл не на весь экран (скриншот).
Самый последний скриншот - это как выглядит экран при открытии приложения, т.е скролл ненамного больше экрана телефона, поле находится внизу скролла.

UPD. При первом нажатии скрывается клавиатура, но остается дополнительный экран, при повторном нажатии на экран убирается этот доп экран. Почему не срабатывает при первом нажатии скрытие клавиатуры и убирание лишнего места на экране?
5ca0c40990e16008479345.jpeg5ca0fe7ab6aa3923807390.jpeg5ca0fe7ab74f7884368966.jpeg5ca0fe7aaea42692192648.jpeg
  • Вопрос задан
  • 222 просмотра
Решения вопроса 1
@uzolenta Автор вопроса
Решение:
@IBOutlet weak var scrollView: UIScrollView!
    
    override func viewDidLoad() {
        super.viewDidLoad()

        NotificationCenter.default.addObserver(self, selector: #selector(KeyBoard), name: UIResponder.keyboardDidHideNotification, object: nil)
        NotificationCenter.default.addObserver(self, selector: #selector(KeyBoard), name: UIResponder.keyboardWillChangeFrameNotification, object: nil)

    }
    
    
    @objc func KeyBoard(notification: Notification){
        let userInfo = notification.userInfo!
        let keyBoardScreenEndFrame = (userInfo[UIResponder.keyboardFrameEndUserInfoKey] as! NSValue).cgRectValue
        let keyBoardViewEndFrame = view.convert(keyBoardScreenEndFrame, from: view.window)
        
        if notification.name == UIResponder.keyboardDidHideNotification{
            scrollView.contentInset = UIEdgeInsets.zero
        }
         if notification.name == UIResponder.keyboardWillChangeFrameNotification{
            scrollView.contentInset = UIEdgeInsets(top: 0, left: 0, bottom: keyBoardViewEndFrame.height, right: 0)
        }
        scrollView.scrollIndicatorInsets = scrollView.contentInset
    }


Там где Вам нужно вызывайте:
view.endEditing(true)

Сдвиг ScrollView работает, обратно все возвращается.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы