Когда клавиатура присутствует, выберите то, что вызывает вид, чтобы скользить вверх - PullRequest
0 голосов
/ 07 апреля 2019

У меня есть tableView с textField в строке 0 и textView в строке 3. В настоящее время мой table table скользит вверх каждый раз, когда присутствует клавиатура.Когда tableView перемещается вверх, вы не можете видеть textField в строке 0. Как отключить это для строки 0 и просто сохранить для строки 3?Я пытался использовать протокол и делегаты, чтобы попытаться инкапсулировать функцию только для строки 3, но это не работает.

enter image description here класс CreateEditItemController: UIViewController, CreateItemDescriptionCellDelegate {

@IBOutlet weak var tableView: UITableView!

func handleKeyboardShow(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
            self.view.frame.origin.y -= 200
        }
    }
}

func handleKeyboardHide(notification: NSNotification) {
    if self.view.frame.origin.y != 0 {
        self.view.frame.origin.y = 0
    }
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    switch indexPath.row {
    ...
    case 3:
        let cell = tableView.dequeueReusableCell(withIdentifier: "CreateItemDescriptionCell", for: indexPath) as! CreateItemDescriptionCell
        cell.delegate = self
        return cell
    default:
        return tableView.cellForRow(at: indexPath)!
     }
   }
 }


protocol CreateItemDescriptionCellDelegate: class {
    func handleKeyboardShow(notification: NSNotification)
    func handleKeyboardHide(notification: NSNotification)
}

class CreateItemDescriptionCell: UITableViewCell, UITextViewDelegate {
//IBOUTLETS
@IBOutlet weak var notesTextView: UITextView!
weak var delegate: CreateItemDescriptionCellDelegate?

override func awakeFromNib() {
    super.awakeFromNib()
    notesTextView.delegate = self

    NotificationCenter.default.addObserver(self, selector: #selector(handleKeyboardShow), name: UIResponder.keyboardWillShowNotification, object: nil)
    NotificationCenter.default.addObserver(self, selector: #selector(handleKeyboardHide), name: UIResponder.keyboardWillHideNotification, object: nil)

}

@objc func handleKeyboardShow(notification: NSNotification) {
    delegate?.handleKeyboardShow(notification: notification)
}

@objc func handleKeyboardHide(notification: NSNotification) {
    delegate?.handleKeyboardHide(notification: notification)
 }
}

Ответы [ 2 ]

1 голос
/ 07 апреля 2019

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

Я использую все время:

TPKeyboardAvoiding - https://github.com/michaeltyson/TPKeyboardAvoiding

IQKeyboardManagerSwift - https://github.com/hackiftekhar/IQKeyboardManager

и многие другие.

1 голос
/ 07 апреля 2019

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

Добавьте это к вашему файлу pod:

# IQKeyboardManager: Codeless drop-in universal library allows to prevent issues of keyboard sliding up
# https://github.com/hackiftekhar/IQKeyboardManager
pod 'IQKeyboardManagerSwift'   

Для получения дополнительной информации и просмотра документации: https://github.com/hackiftekhar/IQKeyboardManager

Единственная строка, которую вы должны написать, будет:

// Enabling IQKeyboardManager
IQKeyboardManager.shared.enable = true

в

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool 

Это решит все ваши проблемы, и вам не нужно будет вычислять кадры или что-то еще.

...