Настройка автоматической c прокрутки UIScrollView с помощью UITextField - PullRequest
1 голос
/ 13 февраля 2020

Я хотел бы настроить смещение прокрутки при отображении клавиатуры. Как вы можете видеть в GIF, текстовые поля довольно близки к клавиатуре, и я хотел бы иметь собственную позицию. Текстовое поле «Имя» должно иметь расстояние на 50 пикселей больше, а текстовое поле «Название ссуды» должно просто прокручиваться до конца моего UIScrollView.

screen recording

в состоянии прокручивать мимо клавиатуры я меняю UIScrollView вставки. Странно iOS автоматически прокручивается к текстовому полю firstResponder (см. GIF).

override func viewDidLoad() {
    NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillShow), name: UIResponder.keyboardWillShowNotification, object: nil)
}

@objc func keyboardWillShow(notification: NSNotification) {
    // get the Keyboard size
    let userInfo = notification.userInfo!
    let keyboardEndFrame = (userInfo[UIResponder.keyboardFrameEndUserInfoKey] as! NSValue).cgRectValue

    // update edge insets for scrollview
    self.mainScrollView.scrollIndicatorInsets.bottom = keyboardEndFrame.height - self.view.layoutMargins.bottom
    self.mainScrollView.contentInset.bottom = keyboardEndFrame.height - self.view.layoutMargins.bottom
}

Я уже пытался использовать метод UITextfieldDelegate: textFieldDidBeginEditing(_ textField: UITextField)
Я также пытался использовать описанный Apple способ здесь: { ссылка }

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

Ответы [ 2 ]

0 голосов
/ 13 февраля 2020

Я нашел решение сам. Проблема заключалась в том, что автоматическая прокрутка c (анимация) мешала моему вызову scrollRectToVisible. Помещение в asyn c решило проблему.

Теперь это выглядит примерно так:

override func viewDidLoad() {
    NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillShow), name: UIResponder.keyboardWillShowNotification, object: nil)
}

@objc func keyboardWillShow(notification: NSNotification) {
    // get the Keyboard size
    let userInfo = notification.userInfo!
    let keyboardEndFrame = (userInfo[UIResponder.keyboardFrameEndUserInfoKey] as! NSValue).cgRectValue

    // update edge insets for scrollview
    self.mainScrollView.scrollIndicatorInsets.bottom = keyboardEndFrame.height - self.view.layoutMargins.bottom
    self.mainScrollView.contentInset.bottom = keyboardEndFrame.height - self.view.layoutMargins.bottom

    var frame = CGRect.zero

    if nameTextField.isFirstResponder {
        frame = CGRect(x: nameTextField.frame.origin.x, y: nameTextField.frame.origin.y + 50, width: nameTextField.frame.size.width, height: nameTextField.frame.size.height)
    }
    if titleTextField.isFirstResponder {
        frame = CGRect(x: titleTextField.frame.origin.x, y: titleTextField.frame.origin.y + titleShortcutsCollectionView.frame.height + 25, width: titleTextField.frame.size.width, height: titleTextField.frame.size.height)
    }

    DispatchQueue.main.async {
        self.mainScrollView.scrollRectToVisible(frame, animated: true)
    }
}
0 голосов
/ 13 февраля 2020

Вы можете отключить автоматическую прокрутку контроллера вида, установив automaticallyAdjustsScrollviewInsets в false, как описано здесь .

Реализация обхода клавиатуры также довольно проста. Вы можете увидеть, как это сделать здесь .

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...