У меня есть tableView с textField в строке 0 и textView в строке 3. Мое табличное представление в настоящее время скользит вверх каждый раз, когда присутствует клавиатура. Когда tableView скользит вверх, вы не можете видеть текстовое поле в строке 0. Как отключить это для строки 0 и просто сохранить для строки 3? Я попытался использовать протокол и делегаты, чтобы попытаться инкапсулировать функцию только для строки 3, но это не работает.
класс 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)
}
}
То, что вы пытаетесь сделать, возможно после некоторой математики, но я бы рекомендовал использовать для этого сторонний модуль вместо того, чтобы делать это вручную на контроллере 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
Это решит все ваши проблемы, и вам не придется рассчитывать кадры или что-то еще.
Есть несколько маршрутов, по которым вы можете пойти, но для простоты есть несколько библиотек, которые вы можете использовать, чтобы получить все вычисления для вас, и вам не нужно об этом беспокоиться.
Один из них, который я использую все время:
TPKeyboardAvoiding
- https://github.com/michaeltyson/TPKeyboardAvoiding
IQKeyboardManagerSwift
- https://github.com/hackiftekhar/IQKeyboardManager
И много других.