2017-02-21 5 views
1

Я пытаюсь сместить текстовое поле, расположенное в нижней части таблицы (фактически, в виде нижнего колонтитула). Так что я попробовал два метода:Сдвиньте табличное представление при появлении клавиатуры

  1. анимировать autolayout Constraint
  2. содержание Animate Вставки в Tableview

Тем не менее, не из них работал, или частично работал. В настоящее время я не в состоянии проверить это на реальном IPad (приложение только IPad), и я тестирование на симуляторе, но я думал, что-то, как это должно работать:

  1. Анимирование contentInsets

    func keyboardWillShow(notification: NSNotification) { 
        if let keyboardHeight = (notification.userInfo?[UIKeyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue.height { 
         UIView.animate(withDuration: 0.2, animations: { 
          self.tableView.contentInset = UIEdgeInsetsMake(0, 0, keyboardHeight, 0) 
         }) 
        } 
    } 
    
    func keyboardWillHide(notification: NSNotification) { 
        UIView.animate(withDuration: 0.2, animations: { 
         self.tableView.contentInset = UIEdgeInsetsMake(0, 0, 0, 0) 
        }) 
    } 
    
  2. оживляющий autolayout ограничений

Таким образом, в первом примере, я никогда не замечал animati on, или перемещение содержимого таблицы. Во втором примере я сделал выход ограничения автоопределения (нижнее вертикальное расстояние), но получаю некоторые нечетные результаты. например, tableview движется вверх, но не полностью, и только в первый раз.

Если я установил точку останова, keyboardHeight равен 471. Я упускаю что-то очевидное?

+0

Используйте [IQKeyboardManager] (https://github.com/hackiftekhar/IQKeyboardManager#installation- с-cocoapod-) – pkc456

+0

@ pkc456 Извините, для меня нет третьей стороны. – Whirlwind

+0

Почему вы не можете проверить на симуляторе? – Devster101

ответ

2

Это то, что я пробовал, и он работал отлично, как и ожидалось.

Вы можете проверить, где вы хотите добавить свой центр уведомлений?

- Анимирование contentInsets

override func viewWillAppear(_ animated: Bool) { 
    NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillShow(notification:)), name: NSNotification.Name.UIKeyboardWillShow, object: nil) 

    NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillHide(notification:)), name: NSNotification.Name.UIKeyboardWillHide, object: nil) 
} 

func keyboardWillShow(notification: NSNotification) { 
    if let keyboardHeight = (notification.userInfo?[UIKeyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue.height { 
     UIView.animate(withDuration: 0.2, animations: { 
      self.tbl.contentInset = UIEdgeInsetsMake(0, 0, keyboardHeight, 0) 
     }) 
    } 
} 

func keyboardWillHide(notification: NSNotification) { 
    UIView.animate(withDuration: 0.2, animations: { 
     self.tbl.contentInset = UIEdgeInsetsMake(0, 0, 0, 0) 
    }) 
} 

- Анимационное autolayout ограничения

Убедитесь, что вы не имеете как Bottom компоновки и высоту ограничения, установленное для UITableView в раскадровке.

ПРИМЕЧАНИЕ

Но есть еще более простой способ сделать это, только с помощью UITableViewController. По умолчанию эта функция позаботится об этой функции. Это, конечно, если у вас нет проблем с его использованием.

EDIT

UITextView будет действовать немного отличается от UITextField. Set delegate для UITextView. И сделайте все выравнивания таблиц в textViewShouldBeginEditing.

extension ViewController: UITextViewDelegate { 
    func textViewShouldBeginEditing(_ textView: UITextView) -> Bool { 
     let pointInTable:CGPoint = textView.superview!.convert(textView.frame.origin, to: tbl) 
     tbl.contentOffset = CGPoint(x: tbl.contentOffset.x, y: pointInTable.y) 
     return true 
    } 
} 
+0

Спасибо, что я проверю, как только я получу руки на компьютере, но я бы сказал, что я поставил наблюдателей в viewDidLoad и удалил их в deinit. Тем не менее, я уверен, что эти методы работают, потому что я проверил, поставив точку останова. И, к сожалению, нет TableViewController здесь вариант ... – Whirlwind

+0

Странно, я пробовал это ... И он работает с 'UITextField'. Но я использую 'UITextView', и это не работает. Я имею в виду, что он скользит, а не на нужную сумму. По крайней мере, похоже. – Whirlwind

+0

Вы хотите, чтобы UITextView в представлении нижнего колонтитула стола прокручивался вверх? – Matt

0

Я использую IQKeyboardManager библиотеку, которая обрабатывает это поведение: https://github.com/hackiftekhar/IQKeyboardManager

IQKeyboardManager позволяет предотвратить проблемы клавиатуры скольжения вверх и накройте UITextField/UITextView без необходимости ввести любой код и не дополнительной настройки , Чтобы использовать IQKeyboardManager, вам просто нужно добавить исходные файлы в свой проект.

Это действительно легко реализовать. Импорт библиотеки с стручков, и просто добавить в ваш AppDelegate:

import IQKeyboardManager 

И в didFinishLaunchingWithOptions:

IQKeyboardManager.sharedManager().enable = true 
Смежные вопросы