After trying out most of the solutions posted here, I'm still having problems moving the text box that appears above the keyboard as a scroll.
These are the links I used in Stackoverflow solutions: Link 1 Link 2 Link 3
I work on the registration screen, which has 1 field behind the keyboard when it appears.
Here is my code:
class SignUpViewController: UIViewController, UITextFieldDelegate, UIScrollViewDelegate, UIPopoverPresentationControllerDelegate { @IBOutlet var firstNameTextField: UITextField! @IBOutlet var lastNameTextField: UITextField! @IBOutlet var phoneNumberTextField: UITextField! @IBOutlet var emailTextField: UITextField! @IBOutlet var submitButton: UIButton! @IBOutlet var professionButton: UIButton! var scrollView: UIScrollView? var activeTextField:UITextField? = UITextField() override func viewDidLoad() { super.viewDidLoad() let notificationCenter = NSNotificationCenter.defaultCenter() notificationCenter.addObserver(self, selector: #selector(SignUpViewController.keyboardWasShown(_:)), name: UIKeyboardWillShowNotification, object: nil) notificationCenter.addObserver(self, selector: #selector(SignUpViewController.keyboardWillBeHidden(_:)), name: UIKeyboardWillHideNotification, object: nil) scrollView = UIScrollView(frame: CGRect(x: 0, y: 0, width: self.view.frame.size.width, height: self.view.frame.size.height)) scrollView!.contentSize = CGSizeMake(self.view.frame.width, self.view.frame.height) defaultSettings() } func defaultSettings() { self.firstNameTextField.delegate = self self.lastNameTextField.delegate = self self.emailTextField.delegate = self self.phoneNumberTextField.delegate = self } func deregisterFromKeyboardNotifications() { //Removing notifies on keyboard appearing NSNotificationCenter.defaultCenter().removeObserver(self, name: UIKeyboardWillShowNotification, object: nil) NSNotificationCenter.defaultCenter().removeObserver(self, name: UIKeyboardWillHideNotification, object: nil) } func keyboardWasShown(notification: NSNotification) { //Need to calculate keyboard exact size due to Apple suggestions //self.scrollView!.scrollEnabled = true var info : NSDictionary = notification.userInfo! var keyboardSize = (info[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.CGRectValue().size var contentInsets : UIEdgeInsets = UIEdgeInsetsMake(0.0, 0.0, keyboardSize!.height, 0.0) self.scrollView!.contentInset = contentInsets self.scrollView!.scrollIndicatorInsets = contentInsets var aRect : CGRect = self.view.frame aRect.size.height -= keyboardSize!.height if (!CGRectContainsPoint(aRect, activeTextField!.frame.origin)) { // print(activeTextField?.frame) // var scrollPoint = CGPointMake(0.0, activeTextField!.frame.origin.y - (keyboardSize!.height-15)) self.scrollView!.scrollRectToVisible((activeTextField?.frame)!, animated: true) //self.scrollView?.setContentOffset(scrollPoint, animated: true) } } func keyboardWillBeHidden(notification: NSNotification) { //Once keyboard disappears, restore original positions //var info : NSDictionary = notification.userInfo! //var keyboardSize = (info[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.CGRectValue().size var contentInsets : UIEdgeInsets = UIEdgeInsetsZero self.scrollView!.contentInset = contentInsets self.scrollView!.scrollIndicatorInsets = contentInsets // self.view.endEditing(true) // self.scrollView!.scrollEnabled = false } func textFieldDidBeginEditing(textField: UITextField) { activeTextField = textField } func textFieldDidEndEditing(textField: UITextField) { activeTextField = nil }
As you can see, I tried scrollRectToVisible with a frame and setContentOffset with Point. Both did not work. Whereas the code selects emailTextField as a hidden text field.
source share