Move Fields when Keyboard Appears

When asked to display the keyboard, the system slides it in from the bottom of the screen and positions it over your app’s content. Because it is placed on top of your content, it is possible for the keyboard to be placed on top of the text object that the user wanted to edit. When this happens, you must adjust your content so that the target object remains visible.

Adjusting your content typically involves temporarily resizing one or more views and positioning them so that the text object remains visible. The simplest way to manage text objects with the keyboard is to embed them inside a UIScrollView object (or one of its subclasses like UITableView). When the keyboard is displayed, all you have to do is reset the content area of the scroll view and scroll the desired text object into position. Thus, in response to a UIKeyboardDidShowNotification, your handler method would do the following:

  1. Get the size of the keyboard.
  2. Adjust the bottom content inset of your scroll view by the keyboard height.
  3. Scroll the target text field into view.

As per apple documentation, here https://developer.apple.com/library/content/documentation/StringsTextFonts/Conceptual/TextAndWebiPhoneOS/KeyboardManagement/KeyboardManagement.html you need to scroll your view only when the current editing should be under the keyboard. You only need to put your needed controls in a scrollViiew.

Swift 2.3

//Declare a variable

var activeField: UITextField?

//Register keyboard for notification

func registerForKeyboardNotifications()

{

//Adding notifies on keyboard appearing

NSNotificationCenter.defaultCenter().addObserver(self, selector: "keyboardWasShown:", name: UIKeyboardWillShowNotification, object: nil)

NSNotificationCenter.defaultCenter().addObserver(self, selector: "keyboardWillBeHidden:", name: UIKeyboardWillHideNotification, object: nil)

}

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 let activeFieldPresent = activeField

{

if (!CGRectContainsPoint(aRect, activeField!.frame.origin))

{

self.scrollView.scrollRectToVisible(activeField!.frame, 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 = UIEdgeInsetsMake(0.0, 0.0, -keyboardSize!.height, 0.0)

self.scrollView.contentInset = contentInsets

self.scrollView.scrollIndicatorInsets = contentInsets

self.view.endEditing(true)

self.scrollView.scrollEnabled = false

}

func textFieldDidBeginEditing(textField: UITextField!)

{

activeField = textField

}

func textFieldDidEndEditing(textField: UITextField!)

{

activeField = nil

}

Be sure to declare your ViewController as `UITextFieldDelegate` and set correct delegates in your initialization methods:

`self.you_text_field.delegate = self`

And remember to call `registerForKeyboardNotifications` on viewInit and `deregisterFromKeyboardNotifications ` on exit.

Swift 3.0

func registerForKeyboardNotifications(){

//Adding notifies on keyboard appearing

NotificationCenter.default.addObserver(self, selector: #selector(keyboardWasShown(notification:)), name: NSNotification.Name.UIKeyboardWillShow, object: nil)

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

}

func deregisterFromKeyboardNotifications(){

//Removing notifies on keyboard appearing

NotificationCenter.default.removeObserver(self, name: NSNotification.Name.UIKeyboardWillShow, object: nil)

NotificationCenter.default.removeObserver(self, name: NSNotification.Name.UIKeyboardWillHide, object: nil)

}

func keyboardWasShown(notification: NSNotification){

//Need to calculate keyboard exact size due to Apple suggestions

self.scrollView.isScrollEnabled = true

var info = notification.userInfo!

let keyboardSize = (info[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue.size

let 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 let activeField = self.activeField {

if (!aRect.contains(activeField.frame.origin)){

self.scrollView.scrollRectToVisible(activeField.frame, animated: true)

}

}

}

func keyboardWillBeHidden(notification: NSNotification){

//Once keyboard disappears, restore original positions

var info = notification.userInfo!

let keyboardSize = (info[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue.size

let contentInsets : UIEdgeInsets = UIEdgeInsetsMake(0.0, 0.0, -keyboardSize!.height, 0.0)

self.scrollView.contentInset = contentInsets

self.scrollView.scrollIndicatorInsets = contentInsets

self.view.endEditing(true)

self.scrollView.isScrollEnabled = false

}

func textFieldDidBeginEditing(_ textField: UITextField){

activeField = textField

}

func textFieldDidEndEditing(_ textField: UITextField){

activeField = nil

}

results matching ""

    No results matching ""