I have a UITableViewController
with around 20 static cells, some of these cells have UITextField
s within them and some are just for selecting with a checkmark. The table is about 1.5 views worth so scrolling is required to get at the lower text fields.
When I click within a textfield at the bottom of the table the keyboard pops up as it should but this then appears over the cell/textfield.
I was under the impression (From Apple docs and elsewhere) that the UITableViewController
class handles scrolling of the view automatically when a keyboard appears in any orientation and shifts the tableview up so that the cell is visible, this isn't happening though.
IOS 5.1, iPad Portrait.
Make sure that if you are overriding viewWillAppear
that you call
[super viewWillAppear:animated];
If you don't, the Scroll View will not scroll up properly.
Swift
super.viewWillAppear(animated)
I found non of these answers to be correct. After a while, I notice that if you push a controller it won't work ... but if you present it modally.. the table will automatically scroll to the used textfield.
Hope that saves time and stress to anyone.
If the auto scroll of UITableViewController doesn't work with the UITextFields in cells or scroll weirdly, do these steps. Swift 5 iOS 13.2 tested 100%
First implement viewWillAppear but don't call super.viewWillAppear (this will stop auto scroll)
override func viewWillAppear(_ animated: Bool) {
}
Then let's do the scroll manually.
override func viewWillAppear(_ animated: Bool) {
//Notification center observers
NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillShow(notification:)),
name: UIResponder.keyboardDidShowNotification, object: nil)
NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillHide(notification:)),
name: UIResponder.keyboardWillHideNotification, object: nil)
}
//keybord show action
@objc func keyboardWillShow(notification: Notification) {
tableView.contentInset = UIEdgeInsets(top: 0, left: 0, bottom: notification.getKeyBoardHeight, right: 0)
}
//keyboard hide action
@objc func keyboardWillHide(notification: Notification) {
tableView.contentInset = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0)
}
extension Notification {
var getKeyBoardHeight: CGFloat {
let userInfo: NSDictionary = self.userInfo! as NSDictionary
let keyboardFrame: NSValue = userInfo.value(forKey: UIResponder.keyboardFrameEndUserInfoKey) as! NSValue
let keyboardRectangle = keyboardFrame.cgRectValue
return keyboardRectangle.height
}
}
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
NotificationCenter.default.removeObserver(self)
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With