Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

UITableViewController not scrolling view when keyboard appears

I have a UITableViewController with around 20 static cells, some of these cells have UITextFields 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.

like image 444
GeoffCoope Avatar asked Jun 28 '12 11:06

GeoffCoope


3 Answers

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)
like image 138
LJ Wilson Avatar answered Nov 08 '22 00:11

LJ Wilson


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.

like image 36
elemento Avatar answered Nov 07 '22 23:11

elemento


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)
}
like image 2
Malith Kuruwita Avatar answered Nov 07 '22 22:11

Malith Kuruwita