Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Tableview scroll content when keyboard shows

I have a table view with a text field and a textview. I've implemented this code like suggested by this apple sample code https://developer.apple.com/library/ios/documentation/StringsTextFonts/Conceptual/TextAndWebiPhoneOS/KeyboardManagement/KeyboardManagement.html

@IBOutlet var myTableView: UITableView func keyboardWasShown (notification: NSNotification) {     println("keyboard was shown")     var info = notification.userInfo     var keyboardSize = info.objectForKey(UIKeyboardFrameBeginUserInfoKey).CGRectValue().size      myTableView.contentInset = UIEdgeInsetsMake(0, 0, keyboardSize.height, 0)     myTableView.scrollIndicatorInsets = myTableView.contentInset }  func keyboardWillBeHidden (notification: NSNotification) {     println("keyboard will be hidden")     myTableView.contentInset = UIEdgeInsetsZero     myTableView.scrollIndicatorInsets = UIEdgeInsetsZero }   override func viewDidLoad() {      super.viewDidLoad()      NSNotificationCenter.defaultCenter().addObserver(self, selector: "keyboardWasShown:", name: UIKeyboardDidShowNotification, object: nil)     NSNotificationCenter.defaultCenter().addObserver(self, selector: "keyboardWillBeHidden:", name: UIKeyboardWillHideNotification, object: nil)  } 

When i click on the "text" of the scroll view go just above the top of the screen, but when i release the keyboard it remains scrolled up. It's just like the insets property can't be modified after the first time. What's my mistake?

like image 733
Andorath Avatar asked Jul 02 '14 10:07

Andorath


Video Answer


2 Answers

override func viewDidLoad() {     super.viewDidLoad()      NotificationCenter.default.addObserver(self, selector: #selector(ViewController.keyboardWillShow), name: NSNotification.Name.UIKeyboardWillShow, object: nil)      NotificationCenter.default.addObserver(self, selector: #selector(ViewController.keyboardWillHide), name: NSNotification.Name.UIKeyboardWillHide, object: nil)  }  func keyboardWillShow(_ notification:Notification) {      if let keyboardSize = (notification.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue {         tableView.contentInset = UIEdgeInsetsMake(0, 0, keyboardSize.height, 0)     } } func keyboardWillHide(_ notification:Notification) {      if let keyboardSize = (notification.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue {         tableView.contentInset = UIEdgeInsetsMake(0, 0, 0, 0)     } } 
like image 199
Zany Avatar answered Sep 23 '22 16:09

Zany


For Swift 4.2

In viewDidLoad() of your UIViewController:

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

And implementation of selectors:

@objc private func keyboardWillShow(notification: NSNotification) {     if let keyboardSize = (notification.userInfo?[UIResponder.keyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue {         tableView.contentInset = UIEdgeInsets(top: 0, left: 0, bottom: keyboardSize.height, right: 0)     } }  @objc private func keyboardWillHide(notification: NSNotification) {     tableView.contentInset = .zero } 
like image 32
Vitalik Kizlov Avatar answered Sep 22 '22 16:09

Vitalik Kizlov