Прокрутка таблицы при появлении клавиатуры для UITextView - PullRequest
0 голосов
/ 18 ноября 2018

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

  if let keyboardHeight = (notification.userInfo?[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue.height {
            tableView.contentInset = UIEdgeInsets(top: 0, left: 0, bottom: keyboardHeight, right: 0)
        }

ничего не происходит. Это похоже на хак, но эта реализация ниже (в частности, в keyboardWillShow) работает для меня, однако странно (1) это не работает в первый раз, но работает каждый последующий раз также (2) большая белая полоса появляется выше клавиатура по какой-то причине? Я не думаю, что это имеет значение, но мой пользовательский интерфейс позволяет пользователю нажимать кнопку редактирования, чтобы они могли видеть, что можно редактировать, затем они редактируют textView, а затем нажимают «Готово». Проблема, которую я пытаюсь решить, заключается в том, что этот textView находится в нижней части tableView, поэтому клавиатура скрывает его во время редактирования.

class ScoreAndStatsViewController: UITableViewController, UITextFieldDelegate, UITextViewDelegate   {

    @IBOutlet weak var editButton: UIButton!
    @IBOutlet weak var notesTextField: UITextView!


    override func viewDidLoad() {
        super.viewDidLoad()

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

    }

 @IBAction func editButtonIsPressed(_ sender: UIButton) {

        if editMode == false {

        notesTextField.isEditable = true

        notesTextField.backgroundColor = iPhoneForeGroundColor


        editButton.setTitle("Done", for: .normal)

        self.editMode = true

        //If edit mode is true, this means they've hit the done button so save
        } else {

            //save data 

            editButton.setTitle("Edit", for: .normal)
            notesTextField.isEditable = false



            notesTextField.backgroundColor = UIColor.clear

            self.editMode = false 


        }
    }



// MARK: Keyboard Notifications

    @objc func keyboardWillShow(notification: NSNotification) {

        let pointInTable:CGPoint = notesTextField.superview!.convert(notesTextField.frame.origin, to: tableView)
        var contentOffset:CGPoint = tableView.contentOffset
        contentOffset.y  = pointInTable.y
        if let accessoryView = tableView.inputAccessoryView {
            contentOffset.y -= accessoryView.frame.size.height
        }
        tableView.contentOffset = contentOffset
    }

    @objc func keyboardWillHide(notification: NSNotification) {
        UIView.animate(withDuration: 0.2, animations: {
            // For some reason adding inset in keyboardWillShow is animated by itself but removing is not, that's why we have to use animateWithDuration here
            self.tableView.contentInset = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0)
        })
    }
}
...