Move a view up only when the keyboard covers an input field












124














I am trying to build an input screen for the iPhone. The screen has a number of input fields. Most of them on the top of the screen, but two fields are at the bottom.
When the user tries to edit the text on the bottom of the screen, the keyboard will pop up and it will cover the screen.
I found a simple solution to move the screen up when this happens, but the result is that the screen always moves up and the fields on top of the screen move out of reach when the user tries to edit those.



Is there a way to have the screen only move when the bottom fields are edited?



I have used this code I found here:



override func viewDidLoad() {
super.viewDidLoad()
NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("keyboardWillShow:"), name:UIKeyboardWillShowNotification, object: nil);
NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("keyboardWillHide:"), name:UIKeyboardWillHideNotification, object: nil);
}

func keyboardWillShow(sender: NSNotification) {
self.view.frame.origin.y -= 150
}

func keyboardWillHide(sender: NSNotification) {
self.view.frame.origin.y += 150
}









share|improve this question
























  • may be you could use func textFieldDidBeginEditing(textField: UITextField!) { } to detect which textfield has started editing and do keyboard hide/ show
    – humblePilgrim
    Mar 2 '15 at 15:32












  • I forgot to mention that I am new to Swift :( What would be the correct syntax to check this? (how do I get the field name in this function?)
    – John Allijn
    Mar 2 '15 at 16:56


















124














I am trying to build an input screen for the iPhone. The screen has a number of input fields. Most of them on the top of the screen, but two fields are at the bottom.
When the user tries to edit the text on the bottom of the screen, the keyboard will pop up and it will cover the screen.
I found a simple solution to move the screen up when this happens, but the result is that the screen always moves up and the fields on top of the screen move out of reach when the user tries to edit those.



Is there a way to have the screen only move when the bottom fields are edited?



I have used this code I found here:



override func viewDidLoad() {
super.viewDidLoad()
NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("keyboardWillShow:"), name:UIKeyboardWillShowNotification, object: nil);
NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("keyboardWillHide:"), name:UIKeyboardWillHideNotification, object: nil);
}

func keyboardWillShow(sender: NSNotification) {
self.view.frame.origin.y -= 150
}

func keyboardWillHide(sender: NSNotification) {
self.view.frame.origin.y += 150
}









share|improve this question
























  • may be you could use func textFieldDidBeginEditing(textField: UITextField!) { } to detect which textfield has started editing and do keyboard hide/ show
    – humblePilgrim
    Mar 2 '15 at 15:32












  • I forgot to mention that I am new to Swift :( What would be the correct syntax to check this? (how do I get the field name in this function?)
    – John Allijn
    Mar 2 '15 at 16:56
















124












124








124


64





I am trying to build an input screen for the iPhone. The screen has a number of input fields. Most of them on the top of the screen, but two fields are at the bottom.
When the user tries to edit the text on the bottom of the screen, the keyboard will pop up and it will cover the screen.
I found a simple solution to move the screen up when this happens, but the result is that the screen always moves up and the fields on top of the screen move out of reach when the user tries to edit those.



Is there a way to have the screen only move when the bottom fields are edited?



I have used this code I found here:



override func viewDidLoad() {
super.viewDidLoad()
NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("keyboardWillShow:"), name:UIKeyboardWillShowNotification, object: nil);
NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("keyboardWillHide:"), name:UIKeyboardWillHideNotification, object: nil);
}

func keyboardWillShow(sender: NSNotification) {
self.view.frame.origin.y -= 150
}

func keyboardWillHide(sender: NSNotification) {
self.view.frame.origin.y += 150
}









share|improve this question















I am trying to build an input screen for the iPhone. The screen has a number of input fields. Most of them on the top of the screen, but two fields are at the bottom.
When the user tries to edit the text on the bottom of the screen, the keyboard will pop up and it will cover the screen.
I found a simple solution to move the screen up when this happens, but the result is that the screen always moves up and the fields on top of the screen move out of reach when the user tries to edit those.



Is there a way to have the screen only move when the bottom fields are edited?



I have used this code I found here:



override func viewDidLoad() {
super.viewDidLoad()
NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("keyboardWillShow:"), name:UIKeyboardWillShowNotification, object: nil);
NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("keyboardWillHide:"), name:UIKeyboardWillHideNotification, object: nil);
}

func keyboardWillShow(sender: NSNotification) {
self.view.frame.origin.y -= 150
}

func keyboardWillHide(sender: NSNotification) {
self.view.frame.origin.y += 150
}






ios swift keyboard xcode6






share|improve this question















share|improve this question













share|improve this question




share|improve this question








edited May 23 '17 at 12:26









Community

11




11










asked Mar 2 '15 at 15:23









John AllijnJohn Allijn

705379




705379












  • may be you could use func textFieldDidBeginEditing(textField: UITextField!) { } to detect which textfield has started editing and do keyboard hide/ show
    – humblePilgrim
    Mar 2 '15 at 15:32












  • I forgot to mention that I am new to Swift :( What would be the correct syntax to check this? (how do I get the field name in this function?)
    – John Allijn
    Mar 2 '15 at 16:56




















  • may be you could use func textFieldDidBeginEditing(textField: UITextField!) { } to detect which textfield has started editing and do keyboard hide/ show
    – humblePilgrim
    Mar 2 '15 at 15:32












  • I forgot to mention that I am new to Swift :( What would be the correct syntax to check this? (how do I get the field name in this function?)
    – John Allijn
    Mar 2 '15 at 16:56


















may be you could use func textFieldDidBeginEditing(textField: UITextField!) { } to detect which textfield has started editing and do keyboard hide/ show
– humblePilgrim
Mar 2 '15 at 15:32






may be you could use func textFieldDidBeginEditing(textField: UITextField!) { } to detect which textfield has started editing and do keyboard hide/ show
– humblePilgrim
Mar 2 '15 at 15:32














I forgot to mention that I am new to Swift :( What would be the correct syntax to check this? (how do I get the field name in this function?)
– John Allijn
Mar 2 '15 at 16:56






I forgot to mention that I am new to Swift :( What would be the correct syntax to check this? (how do I get the field name in this function?)
– John Allijn
Mar 2 '15 at 16:56














23 Answers
23






active

oldest

votes


















182














Your problem is well explained in this document by Apple. Example code on this page (at Listing 4-1) does exactly what you need, it will scroll your view only when the current editing should be under the keyboard. You only need to put your needed controls in a scrollViiew.
The only problem is that this is Objective-C and I think you need it in Swift..so..here it is:



Declare a variable



var activeField: UITextField?


then add these methods



 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:
ex:



self.you_text_field.delegate = self


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



Edit/Update: Swift 3.0 Syntax



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
}





share|improve this answer



















  • 1




    You have to call registerForKeyboardNotifications at viewDidLoad, so you will add an observer to notification center for when keyboard appears or disappears from screen. When these notification fire, methods keyboardWasShown and keyboardWillBeHidden will be called and then scrollview will move accordingly to keyboard size. You can find more detailed information about NotificationCenter here: developer.apple.com/library/mac/documentation/Cocoa/Reference/…
    – Nerkyator
    Mar 2 '15 at 20:47






  • 6




    Thanks, that's exactly what I was looking for - an apple recommended solution. However, in my case I already had a scroll view that spanned outside the viewable area. This code would disable scrolling after the keyboard would hide. I removed "self.scrollView.scrollEnabled = false" and it would still not scroll. What worked for me was "self.scrollView.contentInset = UIEdgeInsetsZero;" this single line in keyboardWillHide event
    – F Yaqoob
    Feb 6 '16 at 19:12






  • 4




    Perfect code. But I need to use UIKeyboardFrameEndUserInfoKey instead of UIKeyboardFrameBeginUserInfoKey, because the latter return height 0. And change the hittest point to the bottom not origin. if let activeField = self.activeField { var point = activeField.frame.origin point.y += activeField.frame.size.height if (!aRect.contains(point)){ self.scrollView.scrollRectToVisible(activeField.frame, animated: true) } }
    – Victor Choy
    Aug 28 '17 at 10:43








  • 2




    @MaX: It should work, but if you want a Swift4 solution you can check this iOS example from Matt Neuburg's book that I suggest to all iOS developers :)
    – Nerkyator
    Apr 18 '18 at 10:04






  • 1




    @MaX I'm not sure if this exclusively a swift 4 thing, but what seems to be happening is that the textField's didBeginEditing method is called AFTER the keyboardWillShow method was called. As a result, the activeField variable is still nil, which means no automatic scrolling happens. My solution was to put the activeField = textField call in the textField's shouldBeginEditing method. This resolves the order of calls issue.
    – HirdayGupta
    May 29 '18 at 9:46



















112














Here is My 2 cents:



Have you tried: https://github.com/hackiftekhar/IQKeyboardManager



Extremely easy to install Swift or Objective-C.



Here how it works:



IQKeyboardManager (Swift):- IQKeyboardManagerSwift is available through CocoaPods, to install it simply add the following line to your Podfile: (#236)



pod 'IQKeyboardManagerSwift'


In AppDelegate.swift, just import IQKeyboardManagerSwift framework and enable IQKeyboardManager.



import IQKeyboardManagerSwift

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

var window: UIWindow?

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {

IQKeyboardManager.sharedManager().enable = true

return true
}
}


And that is all. Easy!






share|improve this answer



















  • 5




    simple easy and very effective tool.
    – JMStudios.jrichardson
    Dec 5 '15 at 21:35






  • 9




    Perfect. This should be built in by default. Seems ridiculous that it's not.
    – NathofGod
    Apr 20 '16 at 8:08










  • This is actually ridiculous, its so easy to implement and just works, plus you get an easy way to toggle through multiple text fields
    – Khoury
    Nov 2 '16 at 3:38






  • 1




    This was an amazing solution, thank you! It took me a little bit of work to get the CocoaPods set up correctly, as those were entirely new to me. After I had that set up, it was literally 2 lines of code to implement this and it worked perfectly right off the bat. Thanks so much!
    – IcyBlueRose
    Apr 6 '17 at 16:50






  • 2




    This did not work for me in Swift 4.1 IQKeyboardManager.sharedManager().enable = true Has been switched to IQKeyboardManager.shared.enable = true
    – Rmalmoe
    Jun 27 '18 at 23:21





















18














The one I found to work perfectly for me was this:



func textFieldDidBeginEditing(textField: UITextField) {
if textField == email || textField == password {
animateViewMoving(true, moveValue: 100)
}
}

func textFieldDidEndEditing(textField: UITextField) {
if textField == email || textField == password {
animateViewMoving(false, moveValue: 100)
}
}

func animateViewMoving (up:Bool, moveValue :CGFloat){
let movementDuration:NSTimeInterval = 0.3
let movement:CGFloat = ( up ? -moveValue : moveValue)

UIView.beginAnimations("animateView", context: nil)
UIView.setAnimationBeginsFromCurrentState(true)
UIView.setAnimationDuration(movementDuration)

self.view.frame = CGRectOffset(self.view.frame, 0, movement)
UIView.commitAnimations()
}


You can also change the height values. Remove the "if statement" if you want to use it for all text fields.



You can even use this for all controls that require user input like TextView.






share|improve this answer



















  • 3




    Moving a UIView frame directly is not a great solution. Additionally this includes hardcoded values that are specific to this use case. I would encourage people to not implement a solution like this and instead do something that is closer to best practices as described in the accepted answer.
    – MobileVet
    Sep 15 '16 at 20:52










  • @MobileVet Understood, but this is the one that works.
    – Tarvo Mäesepp
    Jan 28 '17 at 16:23










  • amazing separate logic without changing in to our code
    – Dilip Jangid
    Mar 29 '17 at 9:37



















7















Is there a way to have the screen only move when the bottom fields are edited?




I had a similar problem and found a pretty straightforward solution without using a scrollView, and instead using if statements within the keyboardWillShow/Hide methods.



func keyboardWillShow(notification: NSNotification) {
if bottomText.editing{
self.view.window?.frame.origin.y = -1 * getKeyboardHeight(notification)
}
}

func keyboardWillHide(notification: NSNotification) {
if self.view.window?.frame.origin.y != 0 {
self.view.window?.frame.origin.y += getKeyboardHeight(notification)
}
}


This was a good solution for me because I only had two text fields.



Shifts whole view up: only when certain text fields (bottomText) are edited



Shifts whole view down: only when the view is not at the original location






share|improve this answer































    4














    Why not implement this in a UITableViewController instead? The keyboard won't hide any text fields when its shown.






    share|improve this answer





















    • this is actually the easiest and the most robust way. And it works even with controls which use a custom InputView instead of the default keyboard (UIKeyboard notifications don't work for these)
      – Radu Simionescu
      Sep 8 '15 at 7:32








    • 1




      There is the problem that you have to be careful, if the table view is embedded (rather than being "the whole page"). For anyone tripped up by that, the solution is explained in posts like this and this. Hope it helps someone dealing with the "most utterly stupid problem in all of Apple" !
      – Fattie
      Dec 6 '16 at 15:44



















    3














    Just use this extension to move any UIView when keyboard is presented.



         extension UIView {
    func bindToKeyboard(){
    NotificationCenter.default.addObserver(self, selector: #selector(self.keyboardWillChange(_:)), name: NSNotification.Name.UIKeyboardWillChangeFrame, object: nil)
    }

    @objc func keyboardWillChange(_ notification: NSNotification){
    let duration = notification.userInfo![UIKeyboardAnimationDurationUserInfoKey] as! Double
    let curve = notification.userInfo![UIKeyboardAnimationCurveUserInfoKey] as! UInt
    let beginningFrame = (notification.userInfo![UIKeyboardFrameBeginUserInfoKey] as! NSValue).cgRectValue
    let endFrame = (notification.userInfo![UIKeyboardFrameEndUserInfoKey] as! NSValue).cgRectValue



    let deltaY = endFrame.origin.y - beginningFrame.origin.y

    UIView.animateKeyframes(withDuration: duration, delay: 0.0, options: UIViewKeyframeAnimationOptions(rawValue: curve), animations: {
    self.frame.origin.y += deltaY
    }, completion: nil)
    }
    }


    Then in your viewdidload bind your view to the keyboard



    UiView.bindToKeyboard()





    share|improve this answer





















    • Good example with extension
      – abdul sathar
      May 8 '18 at 11:39










    • Excellent, thanks a lot !!!
      – Ricky Youssef
      May 26 '18 at 7:20










    • This moves the view up even if it is not needed and if the textfield is at the top of view it will go up and will not be visible. This is not a good solution.
      – Shivam Pokhriyal
      Aug 31 '18 at 18:27



















    3














    Swift 4 (**updated) with extension**




    1. add the buttons in one container

    2. connect bottom constraint of the container with IBOutlet containerBtmConstrain


    3. inViewDidLoad



      self.containerDependOnKeyboardBottomConstrain = containerBtmConstrain
      self.watchForKeyboard()



    4. add the following extension



      import UIKit

      private var xoAssociationKeyForBottomConstrainInVC: UInt8 = 0

      extension UIViewController {

      var containerDependOnKeyboardBottomConstrain :NSLayoutConstraint! {
      get {
      return objc_getAssociatedObject(self, &xoAssociationKeyForBottomConstrainInVC) as? NSLayoutConstraint
      }
      set(newValue) {
      objc_setAssociatedObject(self, &xoAssociationKeyForBottomConstrainInVC, newValue, objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN)
      }
      }

      func watchForKeyboard () {
      NotificationCenter.default.addObserver(self, selector: #selector(self.keyboardWasShown(notification:)), name:UIResponder.keyboardWillShowNotification, object: nil);
      NotificationCenter.default.addObserver(self, selector: #selector(self.keyboardWillHide(notification:)), name:UIResponder.keyboardWillHideNotification, object: nil);
      }

      @objc func keyboardWasShown(notification: NSNotification) {
      let info = notification.userInfo!
      let keyboardFrame: CGRect = (info[UIResponder.keyboardFrameEndUserInfoKey] as! NSValue).cgRectValue

      UIView.animate(withDuration: 0.3, animations: { () -> Void in
      self.containerDependOnKeyboardBottomConstrain.constant = -keyboardFrame.height
      self.view.layoutIfNeeded()
      })
      }

      @objc func keyboardWillHide(notification: NSNotification) {
      UIView.animate(withDuration: 0.3, animations: { () -> Void in
      self.containerDependOnKeyboardBottomConstrain.constant = 0
      self.view.layoutIfNeeded()
      })
      }
      }







    share|improve this answer



















    • 1




      Thanks, mate. It's all about the right key. I was using UIKeyboardFrameBeginUserInfoKey and now using UIKeyboardFrameEndUserInfoKey handles it gracefully.
      – Felipe
      Sep 21 '17 at 0:21



















    2














    I think this clause is wrong:



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


    While the activeField's origin may well be above the keyboard, the maxY might not...



    I would create a 'max' point for the activeField and check if that is in the keyboard Rect.






    share|improve this answer































      2














      I use SwiftLint, which had a few issues with the formatting of the accepted answer. Specifically:



      no space before the colon,
      no force casting,
      prefer UIEdgeInset(top: etc... instead of UIEdgeInsetMake.



      so here are those updates for Swift 3



      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
      scrollView?.isScrollEnabled = true
      var info = notification.userInfo!
      if let keyboardSize = (info[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue.size {
      let contentInsets: UIEdgeInsets = UIEdgeInsets(top: 0.0, left: 0.0, bottom: keyboardSize.height, right: 0.0)

      scrollView?.contentInset = contentInsets
      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!
      if let keyboardSize = (info[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue.size {
      let contentInsets: UIEdgeInsets = UIEdgeInsets(top: 0.0, left: 0.0, bottom: -keyboardSize.height, right: 0.0)
      scrollView?.contentInset = contentInsets
      scrollView?.scrollIndicatorInsets = contentInsets
      }

      view.endEditing(true)
      scrollView?.isScrollEnabled = false
      }

      func textFieldDidBeginEditing(_ textField: UITextField) {
      activeField = textField
      }

      func textFieldDidEndEditing(_ textField: UITextField) {
      activeField = nil
      }





      share|improve this answer





























        1














        Here's my version after reading the documentation provided by Apple and the previous posts. One thing I noticed is that the textView was not handled when covered by the keyboard. Unfortunately, Apple's documentation won't work because, for whatever reason, the keyboard is called AFTER the textViewDidBeginEditing is called. I handled this by calling a central method that checks if the keyboard is displayed AND if a textView or textField is being edited. This way, the process is only fired when BOTH conditions exists.



        Another point with textViews is that their height may be such that the keyboard clips the bottom of the textView and would not adjust if the Top-Left point of the was in view. So, the code I wrote actually takes the screen-referenced Bottom-Left point of any textView or textField and sees if it falls in the screen-referenced coordinates of the presented keyboard implying that the keyboard covers some portion of it.



        let aRect : CGRect = scrollView.convertRect(activeFieldRect!, toView: nil)
        if (CGRectContainsPoint(keyboardRect!, CGPointMake(aRect.origin.x, aRect.maxY))) {
        // scroll textView/textField into view
        }


        If you're using a navigation controller, the subclass also sets the scroll view automatic adjustment for insets to false.



        self.automaticallyAdjustsScrollViewInsets = false


        It walks through each textView and textField to set delegates for handling



            for view in self.view.subviews {
        if view is UITextView {
        let tv = view as! UITextView
        tv.delegate = self
        } else if view is UITextField {
        let tf = view as! UITextField
        tf.delegate = self
        }
        }


        Simply set your base class to the subclass created here for results.



        import UIKit

        class ScrollingFormViewController: UIViewController, UITextViewDelegate, UITextFieldDelegate {

        var activeFieldRect: CGRect?
        var keyboardRect: CGRect?
        var scrollView: UIScrollView!

        override func viewDidLoad() {

        self.automaticallyAdjustsScrollViewInsets = false

        super.viewDidLoad()

        // Do any additional setup after loading the view.
        self.registerForKeyboardNotifications()
        for view in self.view.subviews {
        if view is UITextView {
        let tv = view as! UITextView
        tv.delegate = self
        } else if view is UITextField {
        let tf = view as! UITextField
        tf.delegate = self
        }
        }
        scrollView = UIScrollView(frame: self.view.frame)
        scrollView.scrollEnabled = false
        scrollView.showsVerticalScrollIndicator = false
        scrollView.showsHorizontalScrollIndicator = false
        scrollView.addSubview(self.view)
        self.view = scrollView
        }

        override func viewDidLayoutSubviews() {
        scrollView.sizeToFit()
        scrollView.contentSize = scrollView.frame.size
        super.viewDidLayoutSubviews()
        }

        deinit {
        self.deregisterFromKeyboardNotifications()
        }

        override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
        }


        func registerForKeyboardNotifications()
        {
        //Adding notifies on keyboard appearing
        NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(ScrollingFormViewController.keyboardWasShown), name: UIKeyboardWillShowNotification, object: nil)
        NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(ScrollingFormViewController.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)
        {
        let info : NSDictionary = notification.userInfo!
        keyboardRect = (info[UIKeyboardFrameEndUserInfoKey] as? NSValue)?.CGRectValue()
        adjustForKeyboard()
        }


        func keyboardWillBeHidden(notification: NSNotification)
        {
        keyboardRect = nil
        adjustForKeyboard()
        }

        func adjustForKeyboard() {
        if keyboardRect != nil && activeFieldRect != nil {
        let aRect : CGRect = scrollView.convertRect(activeFieldRect!, toView: nil)
        if (CGRectContainsPoint(keyboardRect!, CGPointMake(aRect.origin.x, aRect.maxY)))
        {
        scrollView.scrollEnabled = true
        let contentInsets : UIEdgeInsets = UIEdgeInsetsMake(0.0, 0.0, keyboardRect!.size.height, 0.0)
        scrollView.contentInset = contentInsets
        scrollView.scrollIndicatorInsets = contentInsets
        scrollView.scrollRectToVisible(activeFieldRect!, animated: true)
        }
        } else {
        let contentInsets : UIEdgeInsets = UIEdgeInsetsZero
        scrollView.contentInset = contentInsets
        scrollView.scrollIndicatorInsets = contentInsets
        scrollView.scrollEnabled = false
        }
        }

        func textViewDidBeginEditing(textView: UITextView) {
        activeFieldRect = textView.frame
        adjustForKeyboard()
        }

        func textViewDidEndEditing(textView: UITextView) {
        activeFieldRect = nil
        adjustForKeyboard()
        }

        func textFieldDidBeginEditing(textField: UITextField)
        {
        activeFieldRect = textField.frame
        adjustForKeyboard()
        }

        func textFieldDidEndEditing(textField: UITextField)
        {
        activeFieldRect = nil
        adjustForKeyboard()
        }

        }





        share|improve this answer





























          1














          In the example below, I am only moving the view up when I start editing the txtLastName or txtCity. I created the variable keyboardActive because the view can move up 2x if I click in txtLastName and after that txtCity.



          Take a look and see if it works for you.



          class ViewController: UIViewController, UITextFieldDelegate {

          @IBOutlet weak var txtFirstName: UITextField!
          @IBOutlet weak var txtLastName: UITextField!
          @IBOutlet weak var txtCity: UITextField!

          var keyboardActive = false

          override func viewDidLoad() {
          super.viewDidLoad()
          self.txtFirstName.delegate = self
          self.txtLastName.delegate = self
          self.txtCity.delegate = self
          }

          func textFieldDidBeginEditing(textField: UITextField) {
          if textField != self.txtFirstName && keyboardActive == false {
          self.view.frame.origin.y -= 165
          self.keyboardActive = true
          }
          }

          func textFieldShouldEndEditing(textField: UITextField) -> Bool {
          if textField != self.txtFirstName && keyboardActive == true {
          self.view.frame.origin.y += 165
          self.keyboardActive = false
          }
          return true
          }

          func textFieldShouldReturn(textField: UITextField) -> Bool {
          self.view.endEditing(true)
          return false
          }

          }





          share|improve this answer































            1














            Awesome answers are already given but this is a different way to deal with this situation (using Swift 3x):



            First of all call the following method in viewWillAppear()



            func registerForKeyboardNotifications() {

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

            }


            Now take one IBOutlet of UIView's top constraints of your UIViewcontroller like this: (here the UIView is the subview of UIScrollView that means you should have a UIScrollView for all your subViews)



            @IBOutlet weak var loginViewTopConstraint: NSLayoutConstraint!


            And an another variable like following and add a delegate i.e. UITextFieldDelegate:



            var activeTextField = UITextField() //This is to keep the reference of UITextField currently active


            After that here is the magical part just paste this below snippet:



            func keyboardWasShown(_ notification: Notification) {

            let keyboardInfo = notification.userInfo as NSDictionary?

            //print(keyboardInfo!)

            let keyboardFrameEnd: NSValue? = (keyboardInfo?.value(forKey: UIKeyboardFrameEndUserInfoKey) as? NSValue)

            let keyboardFrameEndRect: CGRect? = keyboardFrameEnd?.cgRectValue


            if activeTextField.frame.origin.y + activeTextField.frame.size.height + 10 > (keyboardFrameEndRect?.origin.y)! {

            UIView.animate(withDuration: 0.3, delay: 0, options: .transitionFlipFromTop, animations: {() -> Void in

            //code with animation

            //Print some stuff to know what is actually happening
            //print(self.activeTextField.frame.origin.y)
            //print(self.activeTextField.frame.size.height)
            //print(self.activeTextField.frame.size.height)

            self.loginViewTopConstraint.constant = -(self.activeTextField.frame.origin.y + self.activeTextField.frame.size.height - (keyboardFrameEndRect?.origin.y)!) - 30.0

            self.view.layoutIfNeeded()

            }, completion: {(_ finished: Bool) -> Void in
            //code for completion

            })
            }
            }

            func keyboardWillBeHidden(_ notification: Notification) {

            UIView.animate(withDuration: 0.3, animations: {() -> Void in

            self.loginViewTopConstraint.constant = self.view.frame.origin.y
            self.view.layoutIfNeeded()

            })
            }

            //MARK: textfield delegates
            func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool {
            activeTextField = textField
            return true
            }

            func textFieldShouldReturn(_ textField: UITextField) -> Bool {

            switch textField {
            case YOUR_TEXTFIELD_ONE:
            YOUR_TEXTFIELD_TWO.becomeFirstResponder()
            break
            case YOUR_TEXTFIELD_TWO:
            YOUR_TEXTFIELD_THREE.becomeFirstResponder()
            break
            default:
            textField.resignFirstResponder()
            break
            }
            return true
            }


            Now the last snippet:



            //Remove Keyboard Observers
            override func viewWillDisappear(_ animated: Bool) {

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

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


            Don't forget to assign delegates to all your UITextFields in UIStoryboard



            Good luck!






            share|improve this answer































              1














              Swift 3 syntax:



              func textFieldDidBeginEditing(_ textField: UITextField) {
              // add if for some desired textfields
              animateViewMoving(up: true, moveValue: 100)
              }

              func textFieldDidEndEditing(_ textField: UITextField) {
              // add if for some desired textfields
              animateViewMoving(up: false, moveValue: 100)
              }

              func animateViewMoving (up:Bool, moveValue :CGFloat){
              textFieldDidEndEditing(_ textField: UITextField) {

              let movementDuration:TimeInterval = 0.5

              let movement:CGFloat = ( up ? -moveValue : moveValue)

              UIView.beginAnimations("animateView", context: nil)

              UIView.setAnimationBeginsFromCurrentState(true)

              UIView.setAnimationDuration(movementDuration)

              self.view.frame = self.view.frame.offsetBy(dx: 0, dy: movement)

              UIView.commitAnimations()
              }


              this is a nice method to get what you want
              you can add "if" conditions for certain textfields
              but this type works for all... Hope it can be useful for everyone






              share|improve this answer





























                0














                "I forgot to mention that I am new to Swift :( What would be the correct syntax to check this? (how do I get the field name in this function?) "



                Ok . First confirm to the UITextFieldDelegate protocol



                class YourClass:UITextFieldDelegate


                Then implement the function



                func textFieldDidBeginEditing(textField: UITextField!) {

                if textField == txtOne
                {
                println("TextOne")
                }
                if textField == txtTwo
                {
                println("TextTwo")
                }
                }


                You should note that the proper approach is to use a scrollview and place the view that should be shifted up/down inside the scroll view and handle keyboard events accordingly






                share|improve this answer























                • Thanks guys for all your help!!!!
                  – John Allijn
                  Mar 3 '15 at 10:06



















                0














                This code moves up the text field you are editing so that you can view it in Swift 3 for this answer you also have to make your view a UITextFieldDelegate:



                var moveValue: CGFloat!
                var moved: Bool = false
                var activeTextField = UITextField()

                func textFieldDidBeginEditing(_ textField: UITextField) {
                self.activeTextField = textField
                }
                func textFieldDidEndEditing(_ textField: UITextField) {
                if moved == true{
                self.animateViewMoving(up: false, moveValue: moveValue )
                moved = false
                }
                }
                func animateViewMoving (up:Bool, moveValue :CGFloat){
                let movementDuration:TimeInterval = 0.3
                let movement:CGFloat = ( up ? -moveValue : moveValue)

                UIView.beginAnimations("animateView", context: nil)
                UIView.setAnimationBeginsFromCurrentState(true)
                UIView.setAnimationDuration(movementDuration)

                self.view.frame = self.view.frame.offsetBy(dx: 0, dy: movement)
                UIView.commitAnimations()
                }


                And then in viewDidLoad:



                NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillShow), name: .UIKeyboardWillShow, object: nil)


                Which calls (outside viewDidLoad):



                func keyboardWillShow(notification: Notification) {
                if let keyboardSize = (notification.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue {
                let keyboardHeight = keyboardSize.height
                if (view.frame.size.height-self.activeTextField.frame.origin.y) - self.activeTextField.frame.size.height < keyboardHeight{
                moveValue = keyboardHeight - ((view.frame.size.height-self.activeTextField.frame.origin.y) - self.activeTextField.frame.size.height)
                self.animateViewMoving(up: true, moveValue: moveValue )
                moved = true
                }
                }
                }





                share|improve this answer































                  0














                  Swift 3



                  @IBOutlet var scrollView: UIScrollView!
                  @IBOutlet var edtEmail: UITextField!
                  @IBOutlet var bottomTextfieldConstrain: NSLayoutConstraint! // <- this guy is the constrain that connect the bottom of textField to lower object or bottom of page!

                  @IBAction func edtEmailEditingDidBegin(_ sender: Any) {
                  self.bottomTextfieldConstrain.constant = 200
                  let point = CGPoint(x: 0, y: 200)
                  scrollView.contentOffset = point
                  }

                  @IBAction func edtEmailEditingDidEnd(_ sender: Any) {
                  self.bottomTextfieldConstrain.constant = 50
                  }





                  share|improve this answer





























                    0














                    The accepted anwser is nearly perfect. But I need to use UIKeyboardFrameEndUserInfoKey instead of UIKeyboardFrameBeginUserInfoKey, because the latter return keyborad height 0. And change the hittest point to the bottom not origin.



                        var aRect : CGRect = self.view.frame
                    aRect.size.height -= keyboardSize!.height
                    if let activeField = self.activeField {
                    var point = activeField.frame.origin
                    point.y += activeField.frame.size.height
                    if (!aRect.contains(point)){
                    self.scrollView.scrollRectToVisible(activeField.frame, animated: true)
                    }
                    }





                    share|improve this answer





























                      0














                      First of all declare a variable to identify your active UITextField.



                      Step 1:-



                      Like as var activeTextField: UITextField?



                      Step 2:-
                      After this add these two lines in viewDidLoad.



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

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


                      Step 3:-



                      Now define these two methods in your controller class.



                      func keyboardWillShow(_ notification: NSNotification) {

                      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 keyboardWillHide(_ notification: NSNotification) {

                      let contentInsets : UIEdgeInsets = UIEdgeInsetsMake(0.0, 0.0, 0.0, 0.0)
                      self.scrollView.contentInset = contentInsets
                      self.scrollView.scrollIndicatorInsets = contentInsets
                      self.view.endEditing(true)
                      self.scrollView.isScrollEnabled = true
                      }


                      func textFieldDidBeginEditing(_ textField: UITextField){

                      activeField = textField
                      }

                      func textFieldDidEndEditing(_ textField: UITextField){

                      activeField = nil
                      }





                      share|improve this answer































                        0














                        Swift 4 Updated my solution



                        with constraint animation on keyboard show/hide,
                        enjoy.



                        import Foundation
                        import UIKit

                        class PhoneController: UIViewController, UITextFieldDelegate{

                        var phoneLayoutYConstraint: NSLayoutConstraint?

                        override func viewDidLoad() {

                        super.viewDidLoad()

                        view.backgroundColor = .white

                        NotificationCenter.default.addObserver(self, selector: #selector(handleKeyBoardNotification(_:)), name: NSNotification.Name.UIKeyboardWillShow, object: nil)
                        NotificationCenter.default.addObserver(self, selector: #selector(handleKeyBoardNotification(_:)), name: NSNotification.Name.UIKeyboardWillHide, object: nil)
                        phoneField.delegate = self

                        view.addSubview(phoneField)

                        NSLayoutConstraint.activate([phoneField.heightAnchor.constraint(equalToConstant: 50),
                        phoneField.centerXAnchor.constraint(equalTo: view.centerXAnchor),
                        phoneField.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 20),
                        phoneField.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -20)])

                        phoneLayoutYConstraint = NSLayoutConstraint(item: phoneField, attribute: .bottom, relatedBy: .equal, toItem: view, attribute: .bottom, multiplier: 1, constant: 0)
                        phoneLayoutYConstraint?.isActive = true

                        }

                        let phoneField: UITextField = {
                        let text = UITextField()
                        text.translatesAutoresizingMaskIntoConstraints = false
                        text.keyboardType = .numberPad
                        text.font = UIFont.systemFont(ofSize: 30)
                        text.layer.cornerRadius = 5.0
                        text.layer.masksToBounds = true
                        text.layer.borderColor = UIColor.darkGray.cgColor
                        text.layer.borderWidth = 2.0

                        return text
                        }()


                        override func viewDidDisappear(_ animated: Bool) {
                        super.viewWillDisappear(animated)
                        NotificationCenter.default.removeObserver(self)
                        }

                        func textFieldDidBeginEditing(_ textField: UITextField) {

                        }


                        func textFieldDidEndEditing(_ textField: UITextField) {

                        }

                        func textFieldShouldReturn(_ textField: UITextField) -> Bool {
                        textField.resignFirstResponder()
                        return true
                        }


                        @objc func handleKeyBoardNotification(_ notification: NSNotification) {

                        if let info = notification.userInfo {

                        let keyboardSize = (info[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue.size
                        let isKeyBoardShowing = notification.name == NSNotification.Name.UIKeyboardWillShow

                        var aRect : CGRect = self.phoneField.frame
                        aRect.size.height -= keyboardSize!.height


                        phoneLayoutYConstraint?.constant = isKeyBoardShowing ? -keyboardSize!.height : 0

                        UIView.animate(withDuration: 0, delay: 0, options: .curveEaseOut, animations: {
                        self.view.layoutIfNeeded()
                        }, completion: { (boo) in

                        })

                        }
                        }

                        }





                        share|improve this answer





























                          0














                          Swift 4



                          You Can Easily Move Up And Down UITextField With Keyboard With Animation



                          enter image description here



                          import UIKit

                          class ViewController: UIViewController {

                          @IBOutlet var textField: UITextField!

                          override func viewDidLoad() {
                          super.viewDidLoad()
                          NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillChange), name: .UIKeyboardWillChangeFrame, object: nil)
                          }

                          override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
                          textField.resignFirstResponder()
                          }

                          @objc func keyboardWillChange(notification: NSNotification) {

                          let duration = notification.userInfo![UIKeyboardAnimationDurationUserInfoKey] as! Double
                          let curve = notification.userInfo![UIKeyboardAnimationCurveUserInfoKey] as! UInt
                          let curFrame = (notification.userInfo![UIKeyboardFrameBeginUserInfoKey] as! NSValue).cgRectValue
                          let targetFrame = (notification.userInfo![UIKeyboardFrameEndUserInfoKey] as! NSValue).cgRectValue
                          let deltaY = targetFrame.origin.y - curFrame.origin.y

                          UIView.animateKeyframes(withDuration: duration, delay: 0.0, options: UIViewKeyframeAnimationOptions(rawValue: curve), animations: {
                          self.textField.frame.origin.y+=deltaY

                          },completion: nil)
                          }





                          share|improve this answer























                          • Again a solution which will push view up unnecessarily even when it is not needed. Please improve your answer it is misleading
                            – Shivam Pokhriyal
                            Aug 31 '18 at 18:28



















                          0














                          Swift 4.2



                          My solution will (vertically) center the view on a UITextField if its position is under the keyboard.



                          Step 1: Create new swift file and copy-paste UIViewWithKeyboard class.

                          Step 2: In Interface Builder set it as a Custom Class for your top most UIView.



                          import UIKit

                          class UIViewWithKeyboard: UIView {
                          @IBInspectable var offsetMultiplier: CGFloat = 0.75
                          private var keyboardHeight = 0 as CGFloat
                          private weak var activeTextField: UITextField?
                          override func awakeFromNib() {
                          super.awakeFromNib()
                          NotificationCenter.default.addObserver(self, selector: #selector(UIViewWithKeyboard.textDidBeginEditing),
                          name: UITextField.textDidBeginEditingNotification, object: nil)
                          NotificationCenter.default.addObserver(self, selector: #selector(UIViewWithKeyboard.keyboardWillShow),
                          name: UIResponder.keyboardWillShowNotification, object: nil)
                          NotificationCenter.default.addObserver(self, selector: #selector(UIViewWithKeyboard.keyboardWillHide),
                          name: UIResponder.keyboardWillHideNotification, object: nil)
                          }

                          @objc func textDidBeginEditing(_ notification: NSNotification) {
                          self.activeTextField = notification.object as? UITextField
                          }

                          @objc func keyboardWillShow(_ notification: Notification) {
                          if let frameValue = notification.userInfo?[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue {
                          keyboardHeight = frameValue.cgRectValue.size.height
                          if let textField = self.activeTextField {
                          let offset = textField.frame.maxY < frame.maxY - keyboardHeight ? 0
                          : textField.frame.maxY - (frame.maxY - keyboardHeight) * offsetMultiplier
                          self.setView(offset: offset)
                          }
                          }
                          }

                          @objc func keyboardWillHide(_ notification: NSNotification) {
                          self.setView(offset: 0)
                          }

                          func setView(offset: CGFloat) {
                          UIView.animate(withDuration: 0.25) {
                          self.bounds.origin.y = offset
                          }
                          }
                          }





                          share|improve this answer































                            0















                            for swift 4.2.



                            This will apply to any form. No need of scrollview.




                            //make a var of uitextfield



                            var clickedTextField = UITextField()


                            //in your viewdid load



                            NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillShow), name:NSNotification.Name.UIKeyboardWillShow, object: nil);
                            NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillHide), name:NSNotification.Name.UIKeyboardWillHide, object: nil);


                            //know the clicked text field. probably you are having textfields on the entire screen.



                             func textFieldDidBeginEditing(_ textField: UITextField) {


                            clickedTextField = textField


                            }


                            //check if the keyboard is covering textfield or not.



                             @objc func keyboardWillShow(sender: NSNotification,_ textField : UITextField) {
                            if let keyboardSize = (sender.userInfo?[UIKeyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue {

                            if clickedTextField.frame.origin.y > keyboardSize.origin.y {
                            self.view.frame.origin.y = keyboardSize.origin.y - clickedTextField.center.y - 20
                            }
                            }


                            }

                            @objc func keyboardWillHide(sender: NSNotification) {
                            self.view.frame.origin.y = 0
                            }


                            //return to close keyboard



                               func textFieldShouldReturn(_ textField: UITextField) -> Bool {   //delegate method
                            textField.resignFirstResponder()
                            return true
                            }


                            UPDATE :
                            NSNotification.Name.UIKeyboardWillShow & NSNotification.Name.UIKeyboardWillHide are renamed to UIResponder.keyboardWillShowNotification & UIResponder.keyboardWillHideNotification respectively.






                            share|improve this answer































                              -1














                              The problem like this in ReactNative android and IOS apps is solved by following the below steps.



                              install the package like this.



                               $ npm install --save react-native-keyboard-spacer


                              Now import keyboard spacer into your js or jsx files in React Native project like this.



                               import React, { Component } from 'react';
                              import KeyboardSpacer from 'react-native-keyboard-spacer';
                              import { View, Text, TextInput } from 'react-native';

                              export default class Sample extends Component{
                              render(){
                              return(
                              <View style={{flex: 1}}>
                              <TextInput
                              placeholderTextColor="£000000"
                              underlineColorAndroid="transparent"
                              keyboardType="default"
                              maxLength={30}
                              placeholder={'Enter your text!'} />

                              <TextInput placeholder={"another text field"} />

                              <TextInput placeholder={"another text field"} />

                              {/* now place the below component after your input fields form block or view */}

                              <KeyboardSpacer/>
                              </View>
                              );
                              }
                              }


                              Then the keyboard issue of hiding the text fields while writing will be solved.



                                 Note: It will work both IOS and Android React Native apps.

                              Hope It is helpful to others.





                              share|improve this answer























                                Your Answer






                                StackExchange.ifUsing("editor", function () {
                                StackExchange.using("externalEditor", function () {
                                StackExchange.using("snippets", function () {
                                StackExchange.snippets.init();
                                });
                                });
                                }, "code-snippets");

                                StackExchange.ready(function() {
                                var channelOptions = {
                                tags: "".split(" "),
                                id: "1"
                                };
                                initTagRenderer("".split(" "), "".split(" "), channelOptions);

                                StackExchange.using("externalEditor", function() {
                                // Have to fire editor after snippets, if snippets enabled
                                if (StackExchange.settings.snippets.snippetsEnabled) {
                                StackExchange.using("snippets", function() {
                                createEditor();
                                });
                                }
                                else {
                                createEditor();
                                }
                                });

                                function createEditor() {
                                StackExchange.prepareEditor({
                                heartbeatType: 'answer',
                                autoActivateHeartbeat: false,
                                convertImagesToLinks: true,
                                noModals: true,
                                showLowRepImageUploadWarning: true,
                                reputationToPostImages: 10,
                                bindNavPrevention: true,
                                postfix: "",
                                imageUploader: {
                                brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
                                contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
                                allowUrls: true
                                },
                                onDemand: true,
                                discardSelector: ".discard-answer"
                                ,immediatelyShowMarkdownHelp:true
                                });


                                }
                                });














                                draft saved

                                draft discarded


















                                StackExchange.ready(
                                function () {
                                StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f28813339%2fmove-a-view-up-only-when-the-keyboard-covers-an-input-field%23new-answer', 'question_page');
                                }
                                );

                                Post as a guest















                                Required, but never shown

























                                23 Answers
                                23






                                active

                                oldest

                                votes








                                23 Answers
                                23






                                active

                                oldest

                                votes









                                active

                                oldest

                                votes






                                active

                                oldest

                                votes









                                182














                                Your problem is well explained in this document by Apple. Example code on this page (at Listing 4-1) does exactly what you need, it will scroll your view only when the current editing should be under the keyboard. You only need to put your needed controls in a scrollViiew.
                                The only problem is that this is Objective-C and I think you need it in Swift..so..here it is:



                                Declare a variable



                                var activeField: UITextField?


                                then add these methods



                                 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:
                                ex:



                                self.you_text_field.delegate = self


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



                                Edit/Update: Swift 3.0 Syntax



                                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
                                }





                                share|improve this answer



















                                • 1




                                  You have to call registerForKeyboardNotifications at viewDidLoad, so you will add an observer to notification center for when keyboard appears or disappears from screen. When these notification fire, methods keyboardWasShown and keyboardWillBeHidden will be called and then scrollview will move accordingly to keyboard size. You can find more detailed information about NotificationCenter here: developer.apple.com/library/mac/documentation/Cocoa/Reference/…
                                  – Nerkyator
                                  Mar 2 '15 at 20:47






                                • 6




                                  Thanks, that's exactly what I was looking for - an apple recommended solution. However, in my case I already had a scroll view that spanned outside the viewable area. This code would disable scrolling after the keyboard would hide. I removed "self.scrollView.scrollEnabled = false" and it would still not scroll. What worked for me was "self.scrollView.contentInset = UIEdgeInsetsZero;" this single line in keyboardWillHide event
                                  – F Yaqoob
                                  Feb 6 '16 at 19:12






                                • 4




                                  Perfect code. But I need to use UIKeyboardFrameEndUserInfoKey instead of UIKeyboardFrameBeginUserInfoKey, because the latter return height 0. And change the hittest point to the bottom not origin. if let activeField = self.activeField { var point = activeField.frame.origin point.y += activeField.frame.size.height if (!aRect.contains(point)){ self.scrollView.scrollRectToVisible(activeField.frame, animated: true) } }
                                  – Victor Choy
                                  Aug 28 '17 at 10:43








                                • 2




                                  @MaX: It should work, but if you want a Swift4 solution you can check this iOS example from Matt Neuburg's book that I suggest to all iOS developers :)
                                  – Nerkyator
                                  Apr 18 '18 at 10:04






                                • 1




                                  @MaX I'm not sure if this exclusively a swift 4 thing, but what seems to be happening is that the textField's didBeginEditing method is called AFTER the keyboardWillShow method was called. As a result, the activeField variable is still nil, which means no automatic scrolling happens. My solution was to put the activeField = textField call in the textField's shouldBeginEditing method. This resolves the order of calls issue.
                                  – HirdayGupta
                                  May 29 '18 at 9:46
















                                182














                                Your problem is well explained in this document by Apple. Example code on this page (at Listing 4-1) does exactly what you need, it will scroll your view only when the current editing should be under the keyboard. You only need to put your needed controls in a scrollViiew.
                                The only problem is that this is Objective-C and I think you need it in Swift..so..here it is:



                                Declare a variable



                                var activeField: UITextField?


                                then add these methods



                                 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:
                                ex:



                                self.you_text_field.delegate = self


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



                                Edit/Update: Swift 3.0 Syntax



                                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
                                }





                                share|improve this answer



















                                • 1




                                  You have to call registerForKeyboardNotifications at viewDidLoad, so you will add an observer to notification center for when keyboard appears or disappears from screen. When these notification fire, methods keyboardWasShown and keyboardWillBeHidden will be called and then scrollview will move accordingly to keyboard size. You can find more detailed information about NotificationCenter here: developer.apple.com/library/mac/documentation/Cocoa/Reference/…
                                  – Nerkyator
                                  Mar 2 '15 at 20:47






                                • 6




                                  Thanks, that's exactly what I was looking for - an apple recommended solution. However, in my case I already had a scroll view that spanned outside the viewable area. This code would disable scrolling after the keyboard would hide. I removed "self.scrollView.scrollEnabled = false" and it would still not scroll. What worked for me was "self.scrollView.contentInset = UIEdgeInsetsZero;" this single line in keyboardWillHide event
                                  – F Yaqoob
                                  Feb 6 '16 at 19:12






                                • 4




                                  Perfect code. But I need to use UIKeyboardFrameEndUserInfoKey instead of UIKeyboardFrameBeginUserInfoKey, because the latter return height 0. And change the hittest point to the bottom not origin. if let activeField = self.activeField { var point = activeField.frame.origin point.y += activeField.frame.size.height if (!aRect.contains(point)){ self.scrollView.scrollRectToVisible(activeField.frame, animated: true) } }
                                  – Victor Choy
                                  Aug 28 '17 at 10:43








                                • 2




                                  @MaX: It should work, but if you want a Swift4 solution you can check this iOS example from Matt Neuburg's book that I suggest to all iOS developers :)
                                  – Nerkyator
                                  Apr 18 '18 at 10:04






                                • 1




                                  @MaX I'm not sure if this exclusively a swift 4 thing, but what seems to be happening is that the textField's didBeginEditing method is called AFTER the keyboardWillShow method was called. As a result, the activeField variable is still nil, which means no automatic scrolling happens. My solution was to put the activeField = textField call in the textField's shouldBeginEditing method. This resolves the order of calls issue.
                                  – HirdayGupta
                                  May 29 '18 at 9:46














                                182












                                182








                                182






                                Your problem is well explained in this document by Apple. Example code on this page (at Listing 4-1) does exactly what you need, it will scroll your view only when the current editing should be under the keyboard. You only need to put your needed controls in a scrollViiew.
                                The only problem is that this is Objective-C and I think you need it in Swift..so..here it is:



                                Declare a variable



                                var activeField: UITextField?


                                then add these methods



                                 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:
                                ex:



                                self.you_text_field.delegate = self


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



                                Edit/Update: Swift 3.0 Syntax



                                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
                                }





                                share|improve this answer














                                Your problem is well explained in this document by Apple. Example code on this page (at Listing 4-1) does exactly what you need, it will scroll your view only when the current editing should be under the keyboard. You only need to put your needed controls in a scrollViiew.
                                The only problem is that this is Objective-C and I think you need it in Swift..so..here it is:



                                Declare a variable



                                var activeField: UITextField?


                                then add these methods



                                 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:
                                ex:



                                self.you_text_field.delegate = self


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



                                Edit/Update: Swift 3.0 Syntax



                                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
                                }






                                share|improve this answer














                                share|improve this answer



                                share|improve this answer








                                edited Aug 7 '18 at 12:15









                                ScottyBlades

                                1,5191522




                                1,5191522










                                answered Mar 2 '15 at 15:41









                                NerkyatorNerkyator

                                3,19111625




                                3,19111625








                                • 1




                                  You have to call registerForKeyboardNotifications at viewDidLoad, so you will add an observer to notification center for when keyboard appears or disappears from screen. When these notification fire, methods keyboardWasShown and keyboardWillBeHidden will be called and then scrollview will move accordingly to keyboard size. You can find more detailed information about NotificationCenter here: developer.apple.com/library/mac/documentation/Cocoa/Reference/…
                                  – Nerkyator
                                  Mar 2 '15 at 20:47






                                • 6




                                  Thanks, that's exactly what I was looking for - an apple recommended solution. However, in my case I already had a scroll view that spanned outside the viewable area. This code would disable scrolling after the keyboard would hide. I removed "self.scrollView.scrollEnabled = false" and it would still not scroll. What worked for me was "self.scrollView.contentInset = UIEdgeInsetsZero;" this single line in keyboardWillHide event
                                  – F Yaqoob
                                  Feb 6 '16 at 19:12






                                • 4




                                  Perfect code. But I need to use UIKeyboardFrameEndUserInfoKey instead of UIKeyboardFrameBeginUserInfoKey, because the latter return height 0. And change the hittest point to the bottom not origin. if let activeField = self.activeField { var point = activeField.frame.origin point.y += activeField.frame.size.height if (!aRect.contains(point)){ self.scrollView.scrollRectToVisible(activeField.frame, animated: true) } }
                                  – Victor Choy
                                  Aug 28 '17 at 10:43








                                • 2




                                  @MaX: It should work, but if you want a Swift4 solution you can check this iOS example from Matt Neuburg's book that I suggest to all iOS developers :)
                                  – Nerkyator
                                  Apr 18 '18 at 10:04






                                • 1




                                  @MaX I'm not sure if this exclusively a swift 4 thing, but what seems to be happening is that the textField's didBeginEditing method is called AFTER the keyboardWillShow method was called. As a result, the activeField variable is still nil, which means no automatic scrolling happens. My solution was to put the activeField = textField call in the textField's shouldBeginEditing method. This resolves the order of calls issue.
                                  – HirdayGupta
                                  May 29 '18 at 9:46














                                • 1




                                  You have to call registerForKeyboardNotifications at viewDidLoad, so you will add an observer to notification center for when keyboard appears or disappears from screen. When these notification fire, methods keyboardWasShown and keyboardWillBeHidden will be called and then scrollview will move accordingly to keyboard size. You can find more detailed information about NotificationCenter here: developer.apple.com/library/mac/documentation/Cocoa/Reference/…
                                  – Nerkyator
                                  Mar 2 '15 at 20:47






                                • 6




                                  Thanks, that's exactly what I was looking for - an apple recommended solution. However, in my case I already had a scroll view that spanned outside the viewable area. This code would disable scrolling after the keyboard would hide. I removed "self.scrollView.scrollEnabled = false" and it would still not scroll. What worked for me was "self.scrollView.contentInset = UIEdgeInsetsZero;" this single line in keyboardWillHide event
                                  – F Yaqoob
                                  Feb 6 '16 at 19:12






                                • 4




                                  Perfect code. But I need to use UIKeyboardFrameEndUserInfoKey instead of UIKeyboardFrameBeginUserInfoKey, because the latter return height 0. And change the hittest point to the bottom not origin. if let activeField = self.activeField { var point = activeField.frame.origin point.y += activeField.frame.size.height if (!aRect.contains(point)){ self.scrollView.scrollRectToVisible(activeField.frame, animated: true) } }
                                  – Victor Choy
                                  Aug 28 '17 at 10:43








                                • 2




                                  @MaX: It should work, but if you want a Swift4 solution you can check this iOS example from Matt Neuburg's book that I suggest to all iOS developers :)
                                  – Nerkyator
                                  Apr 18 '18 at 10:04






                                • 1




                                  @MaX I'm not sure if this exclusively a swift 4 thing, but what seems to be happening is that the textField's didBeginEditing method is called AFTER the keyboardWillShow method was called. As a result, the activeField variable is still nil, which means no automatic scrolling happens. My solution was to put the activeField = textField call in the textField's shouldBeginEditing method. This resolves the order of calls issue.
                                  – HirdayGupta
                                  May 29 '18 at 9:46








                                1




                                1




                                You have to call registerForKeyboardNotifications at viewDidLoad, so you will add an observer to notification center for when keyboard appears or disappears from screen. When these notification fire, methods keyboardWasShown and keyboardWillBeHidden will be called and then scrollview will move accordingly to keyboard size. You can find more detailed information about NotificationCenter here: developer.apple.com/library/mac/documentation/Cocoa/Reference/…
                                – Nerkyator
                                Mar 2 '15 at 20:47




                                You have to call registerForKeyboardNotifications at viewDidLoad, so you will add an observer to notification center for when keyboard appears or disappears from screen. When these notification fire, methods keyboardWasShown and keyboardWillBeHidden will be called and then scrollview will move accordingly to keyboard size. You can find more detailed information about NotificationCenter here: developer.apple.com/library/mac/documentation/Cocoa/Reference/…
                                – Nerkyator
                                Mar 2 '15 at 20:47




                                6




                                6




                                Thanks, that's exactly what I was looking for - an apple recommended solution. However, in my case I already had a scroll view that spanned outside the viewable area. This code would disable scrolling after the keyboard would hide. I removed "self.scrollView.scrollEnabled = false" and it would still not scroll. What worked for me was "self.scrollView.contentInset = UIEdgeInsetsZero;" this single line in keyboardWillHide event
                                – F Yaqoob
                                Feb 6 '16 at 19:12




                                Thanks, that's exactly what I was looking for - an apple recommended solution. However, in my case I already had a scroll view that spanned outside the viewable area. This code would disable scrolling after the keyboard would hide. I removed "self.scrollView.scrollEnabled = false" and it would still not scroll. What worked for me was "self.scrollView.contentInset = UIEdgeInsetsZero;" this single line in keyboardWillHide event
                                – F Yaqoob
                                Feb 6 '16 at 19:12




                                4




                                4




                                Perfect code. But I need to use UIKeyboardFrameEndUserInfoKey instead of UIKeyboardFrameBeginUserInfoKey, because the latter return height 0. And change the hittest point to the bottom not origin. if let activeField = self.activeField { var point = activeField.frame.origin point.y += activeField.frame.size.height if (!aRect.contains(point)){ self.scrollView.scrollRectToVisible(activeField.frame, animated: true) } }
                                – Victor Choy
                                Aug 28 '17 at 10:43






                                Perfect code. But I need to use UIKeyboardFrameEndUserInfoKey instead of UIKeyboardFrameBeginUserInfoKey, because the latter return height 0. And change the hittest point to the bottom not origin. if let activeField = self.activeField { var point = activeField.frame.origin point.y += activeField.frame.size.height if (!aRect.contains(point)){ self.scrollView.scrollRectToVisible(activeField.frame, animated: true) } }
                                – Victor Choy
                                Aug 28 '17 at 10:43






                                2




                                2




                                @MaX: It should work, but if you want a Swift4 solution you can check this iOS example from Matt Neuburg's book that I suggest to all iOS developers :)
                                – Nerkyator
                                Apr 18 '18 at 10:04




                                @MaX: It should work, but if you want a Swift4 solution you can check this iOS example from Matt Neuburg's book that I suggest to all iOS developers :)
                                – Nerkyator
                                Apr 18 '18 at 10:04




                                1




                                1




                                @MaX I'm not sure if this exclusively a swift 4 thing, but what seems to be happening is that the textField's didBeginEditing method is called AFTER the keyboardWillShow method was called. As a result, the activeField variable is still nil, which means no automatic scrolling happens. My solution was to put the activeField = textField call in the textField's shouldBeginEditing method. This resolves the order of calls issue.
                                – HirdayGupta
                                May 29 '18 at 9:46




                                @MaX I'm not sure if this exclusively a swift 4 thing, but what seems to be happening is that the textField's didBeginEditing method is called AFTER the keyboardWillShow method was called. As a result, the activeField variable is still nil, which means no automatic scrolling happens. My solution was to put the activeField = textField call in the textField's shouldBeginEditing method. This resolves the order of calls issue.
                                – HirdayGupta
                                May 29 '18 at 9:46













                                112














                                Here is My 2 cents:



                                Have you tried: https://github.com/hackiftekhar/IQKeyboardManager



                                Extremely easy to install Swift or Objective-C.



                                Here how it works:



                                IQKeyboardManager (Swift):- IQKeyboardManagerSwift is available through CocoaPods, to install it simply add the following line to your Podfile: (#236)



                                pod 'IQKeyboardManagerSwift'


                                In AppDelegate.swift, just import IQKeyboardManagerSwift framework and enable IQKeyboardManager.



                                import IQKeyboardManagerSwift

                                @UIApplicationMain
                                class AppDelegate: UIResponder, UIApplicationDelegate {

                                var window: UIWindow?

                                func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {

                                IQKeyboardManager.sharedManager().enable = true

                                return true
                                }
                                }


                                And that is all. Easy!






                                share|improve this answer



















                                • 5




                                  simple easy and very effective tool.
                                  – JMStudios.jrichardson
                                  Dec 5 '15 at 21:35






                                • 9




                                  Perfect. This should be built in by default. Seems ridiculous that it's not.
                                  – NathofGod
                                  Apr 20 '16 at 8:08










                                • This is actually ridiculous, its so easy to implement and just works, plus you get an easy way to toggle through multiple text fields
                                  – Khoury
                                  Nov 2 '16 at 3:38






                                • 1




                                  This was an amazing solution, thank you! It took me a little bit of work to get the CocoaPods set up correctly, as those were entirely new to me. After I had that set up, it was literally 2 lines of code to implement this and it worked perfectly right off the bat. Thanks so much!
                                  – IcyBlueRose
                                  Apr 6 '17 at 16:50






                                • 2




                                  This did not work for me in Swift 4.1 IQKeyboardManager.sharedManager().enable = true Has been switched to IQKeyboardManager.shared.enable = true
                                  – Rmalmoe
                                  Jun 27 '18 at 23:21


















                                112














                                Here is My 2 cents:



                                Have you tried: https://github.com/hackiftekhar/IQKeyboardManager



                                Extremely easy to install Swift or Objective-C.



                                Here how it works:



                                IQKeyboardManager (Swift):- IQKeyboardManagerSwift is available through CocoaPods, to install it simply add the following line to your Podfile: (#236)



                                pod 'IQKeyboardManagerSwift'


                                In AppDelegate.swift, just import IQKeyboardManagerSwift framework and enable IQKeyboardManager.



                                import IQKeyboardManagerSwift

                                @UIApplicationMain
                                class AppDelegate: UIResponder, UIApplicationDelegate {

                                var window: UIWindow?

                                func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {

                                IQKeyboardManager.sharedManager().enable = true

                                return true
                                }
                                }


                                And that is all. Easy!






                                share|improve this answer



















                                • 5




                                  simple easy and very effective tool.
                                  – JMStudios.jrichardson
                                  Dec 5 '15 at 21:35






                                • 9




                                  Perfect. This should be built in by default. Seems ridiculous that it's not.
                                  – NathofGod
                                  Apr 20 '16 at 8:08










                                • This is actually ridiculous, its so easy to implement and just works, plus you get an easy way to toggle through multiple text fields
                                  – Khoury
                                  Nov 2 '16 at 3:38






                                • 1




                                  This was an amazing solution, thank you! It took me a little bit of work to get the CocoaPods set up correctly, as those were entirely new to me. After I had that set up, it was literally 2 lines of code to implement this and it worked perfectly right off the bat. Thanks so much!
                                  – IcyBlueRose
                                  Apr 6 '17 at 16:50






                                • 2




                                  This did not work for me in Swift 4.1 IQKeyboardManager.sharedManager().enable = true Has been switched to IQKeyboardManager.shared.enable = true
                                  – Rmalmoe
                                  Jun 27 '18 at 23:21
















                                112












                                112








                                112






                                Here is My 2 cents:



                                Have you tried: https://github.com/hackiftekhar/IQKeyboardManager



                                Extremely easy to install Swift or Objective-C.



                                Here how it works:



                                IQKeyboardManager (Swift):- IQKeyboardManagerSwift is available through CocoaPods, to install it simply add the following line to your Podfile: (#236)



                                pod 'IQKeyboardManagerSwift'


                                In AppDelegate.swift, just import IQKeyboardManagerSwift framework and enable IQKeyboardManager.



                                import IQKeyboardManagerSwift

                                @UIApplicationMain
                                class AppDelegate: UIResponder, UIApplicationDelegate {

                                var window: UIWindow?

                                func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {

                                IQKeyboardManager.sharedManager().enable = true

                                return true
                                }
                                }


                                And that is all. Easy!






                                share|improve this answer














                                Here is My 2 cents:



                                Have you tried: https://github.com/hackiftekhar/IQKeyboardManager



                                Extremely easy to install Swift or Objective-C.



                                Here how it works:



                                IQKeyboardManager (Swift):- IQKeyboardManagerSwift is available through CocoaPods, to install it simply add the following line to your Podfile: (#236)



                                pod 'IQKeyboardManagerSwift'


                                In AppDelegate.swift, just import IQKeyboardManagerSwift framework and enable IQKeyboardManager.



                                import IQKeyboardManagerSwift

                                @UIApplicationMain
                                class AppDelegate: UIResponder, UIApplicationDelegate {

                                var window: UIWindow?

                                func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {

                                IQKeyboardManager.sharedManager().enable = true

                                return true
                                }
                                }


                                And that is all. Easy!







                                share|improve this answer














                                share|improve this answer



                                share|improve this answer








                                edited Sep 14 '15 at 5:05

























                                answered Sep 14 '15 at 0:37









                                Mr HMr H

                                3,58432834




                                3,58432834








                                • 5




                                  simple easy and very effective tool.
                                  – JMStudios.jrichardson
                                  Dec 5 '15 at 21:35






                                • 9




                                  Perfect. This should be built in by default. Seems ridiculous that it's not.
                                  – NathofGod
                                  Apr 20 '16 at 8:08










                                • This is actually ridiculous, its so easy to implement and just works, plus you get an easy way to toggle through multiple text fields
                                  – Khoury
                                  Nov 2 '16 at 3:38






                                • 1




                                  This was an amazing solution, thank you! It took me a little bit of work to get the CocoaPods set up correctly, as those were entirely new to me. After I had that set up, it was literally 2 lines of code to implement this and it worked perfectly right off the bat. Thanks so much!
                                  – IcyBlueRose
                                  Apr 6 '17 at 16:50






                                • 2




                                  This did not work for me in Swift 4.1 IQKeyboardManager.sharedManager().enable = true Has been switched to IQKeyboardManager.shared.enable = true
                                  – Rmalmoe
                                  Jun 27 '18 at 23:21
















                                • 5




                                  simple easy and very effective tool.
                                  – JMStudios.jrichardson
                                  Dec 5 '15 at 21:35






                                • 9




                                  Perfect. This should be built in by default. Seems ridiculous that it's not.
                                  – NathofGod
                                  Apr 20 '16 at 8:08










                                • This is actually ridiculous, its so easy to implement and just works, plus you get an easy way to toggle through multiple text fields
                                  – Khoury
                                  Nov 2 '16 at 3:38






                                • 1




                                  This was an amazing solution, thank you! It took me a little bit of work to get the CocoaPods set up correctly, as those were entirely new to me. After I had that set up, it was literally 2 lines of code to implement this and it worked perfectly right off the bat. Thanks so much!
                                  – IcyBlueRose
                                  Apr 6 '17 at 16:50






                                • 2




                                  This did not work for me in Swift 4.1 IQKeyboardManager.sharedManager().enable = true Has been switched to IQKeyboardManager.shared.enable = true
                                  – Rmalmoe
                                  Jun 27 '18 at 23:21










                                5




                                5




                                simple easy and very effective tool.
                                – JMStudios.jrichardson
                                Dec 5 '15 at 21:35




                                simple easy and very effective tool.
                                – JMStudios.jrichardson
                                Dec 5 '15 at 21:35




                                9




                                9




                                Perfect. This should be built in by default. Seems ridiculous that it's not.
                                – NathofGod
                                Apr 20 '16 at 8:08




                                Perfect. This should be built in by default. Seems ridiculous that it's not.
                                – NathofGod
                                Apr 20 '16 at 8:08












                                This is actually ridiculous, its so easy to implement and just works, plus you get an easy way to toggle through multiple text fields
                                – Khoury
                                Nov 2 '16 at 3:38




                                This is actually ridiculous, its so easy to implement and just works, plus you get an easy way to toggle through multiple text fields
                                – Khoury
                                Nov 2 '16 at 3:38




                                1




                                1




                                This was an amazing solution, thank you! It took me a little bit of work to get the CocoaPods set up correctly, as those were entirely new to me. After I had that set up, it was literally 2 lines of code to implement this and it worked perfectly right off the bat. Thanks so much!
                                – IcyBlueRose
                                Apr 6 '17 at 16:50




                                This was an amazing solution, thank you! It took me a little bit of work to get the CocoaPods set up correctly, as those were entirely new to me. After I had that set up, it was literally 2 lines of code to implement this and it worked perfectly right off the bat. Thanks so much!
                                – IcyBlueRose
                                Apr 6 '17 at 16:50




                                2




                                2




                                This did not work for me in Swift 4.1 IQKeyboardManager.sharedManager().enable = true Has been switched to IQKeyboardManager.shared.enable = true
                                – Rmalmoe
                                Jun 27 '18 at 23:21






                                This did not work for me in Swift 4.1 IQKeyboardManager.sharedManager().enable = true Has been switched to IQKeyboardManager.shared.enable = true
                                – Rmalmoe
                                Jun 27 '18 at 23:21













                                18














                                The one I found to work perfectly for me was this:



                                func textFieldDidBeginEditing(textField: UITextField) {
                                if textField == email || textField == password {
                                animateViewMoving(true, moveValue: 100)
                                }
                                }

                                func textFieldDidEndEditing(textField: UITextField) {
                                if textField == email || textField == password {
                                animateViewMoving(false, moveValue: 100)
                                }
                                }

                                func animateViewMoving (up:Bool, moveValue :CGFloat){
                                let movementDuration:NSTimeInterval = 0.3
                                let movement:CGFloat = ( up ? -moveValue : moveValue)

                                UIView.beginAnimations("animateView", context: nil)
                                UIView.setAnimationBeginsFromCurrentState(true)
                                UIView.setAnimationDuration(movementDuration)

                                self.view.frame = CGRectOffset(self.view.frame, 0, movement)
                                UIView.commitAnimations()
                                }


                                You can also change the height values. Remove the "if statement" if you want to use it for all text fields.



                                You can even use this for all controls that require user input like TextView.






                                share|improve this answer



















                                • 3




                                  Moving a UIView frame directly is not a great solution. Additionally this includes hardcoded values that are specific to this use case. I would encourage people to not implement a solution like this and instead do something that is closer to best practices as described in the accepted answer.
                                  – MobileVet
                                  Sep 15 '16 at 20:52










                                • @MobileVet Understood, but this is the one that works.
                                  – Tarvo Mäesepp
                                  Jan 28 '17 at 16:23










                                • amazing separate logic without changing in to our code
                                  – Dilip Jangid
                                  Mar 29 '17 at 9:37
















                                18














                                The one I found to work perfectly for me was this:



                                func textFieldDidBeginEditing(textField: UITextField) {
                                if textField == email || textField == password {
                                animateViewMoving(true, moveValue: 100)
                                }
                                }

                                func textFieldDidEndEditing(textField: UITextField) {
                                if textField == email || textField == password {
                                animateViewMoving(false, moveValue: 100)
                                }
                                }

                                func animateViewMoving (up:Bool, moveValue :CGFloat){
                                let movementDuration:NSTimeInterval = 0.3
                                let movement:CGFloat = ( up ? -moveValue : moveValue)

                                UIView.beginAnimations("animateView", context: nil)
                                UIView.setAnimationBeginsFromCurrentState(true)
                                UIView.setAnimationDuration(movementDuration)

                                self.view.frame = CGRectOffset(self.view.frame, 0, movement)
                                UIView.commitAnimations()
                                }


                                You can also change the height values. Remove the "if statement" if you want to use it for all text fields.



                                You can even use this for all controls that require user input like TextView.






                                share|improve this answer



















                                • 3




                                  Moving a UIView frame directly is not a great solution. Additionally this includes hardcoded values that are specific to this use case. I would encourage people to not implement a solution like this and instead do something that is closer to best practices as described in the accepted answer.
                                  – MobileVet
                                  Sep 15 '16 at 20:52










                                • @MobileVet Understood, but this is the one that works.
                                  – Tarvo Mäesepp
                                  Jan 28 '17 at 16:23










                                • amazing separate logic without changing in to our code
                                  – Dilip Jangid
                                  Mar 29 '17 at 9:37














                                18












                                18








                                18






                                The one I found to work perfectly for me was this:



                                func textFieldDidBeginEditing(textField: UITextField) {
                                if textField == email || textField == password {
                                animateViewMoving(true, moveValue: 100)
                                }
                                }

                                func textFieldDidEndEditing(textField: UITextField) {
                                if textField == email || textField == password {
                                animateViewMoving(false, moveValue: 100)
                                }
                                }

                                func animateViewMoving (up:Bool, moveValue :CGFloat){
                                let movementDuration:NSTimeInterval = 0.3
                                let movement:CGFloat = ( up ? -moveValue : moveValue)

                                UIView.beginAnimations("animateView", context: nil)
                                UIView.setAnimationBeginsFromCurrentState(true)
                                UIView.setAnimationDuration(movementDuration)

                                self.view.frame = CGRectOffset(self.view.frame, 0, movement)
                                UIView.commitAnimations()
                                }


                                You can also change the height values. Remove the "if statement" if you want to use it for all text fields.



                                You can even use this for all controls that require user input like TextView.






                                share|improve this answer














                                The one I found to work perfectly for me was this:



                                func textFieldDidBeginEditing(textField: UITextField) {
                                if textField == email || textField == password {
                                animateViewMoving(true, moveValue: 100)
                                }
                                }

                                func textFieldDidEndEditing(textField: UITextField) {
                                if textField == email || textField == password {
                                animateViewMoving(false, moveValue: 100)
                                }
                                }

                                func animateViewMoving (up:Bool, moveValue :CGFloat){
                                let movementDuration:NSTimeInterval = 0.3
                                let movement:CGFloat = ( up ? -moveValue : moveValue)

                                UIView.beginAnimations("animateView", context: nil)
                                UIView.setAnimationBeginsFromCurrentState(true)
                                UIView.setAnimationDuration(movementDuration)

                                self.view.frame = CGRectOffset(self.view.frame, 0, movement)
                                UIView.commitAnimations()
                                }


                                You can also change the height values. Remove the "if statement" if you want to use it for all text fields.



                                You can even use this for all controls that require user input like TextView.







                                share|improve this answer














                                share|improve this answer



                                share|improve this answer








                                edited Aug 1 '16 at 8:28









                                Jayprakash Dubey

                                24k9122131




                                24k9122131










                                answered May 25 '16 at 1:13









                                EdwardEdward

                                1,3231922




                                1,3231922








                                • 3




                                  Moving a UIView frame directly is not a great solution. Additionally this includes hardcoded values that are specific to this use case. I would encourage people to not implement a solution like this and instead do something that is closer to best practices as described in the accepted answer.
                                  – MobileVet
                                  Sep 15 '16 at 20:52










                                • @MobileVet Understood, but this is the one that works.
                                  – Tarvo Mäesepp
                                  Jan 28 '17 at 16:23










                                • amazing separate logic without changing in to our code
                                  – Dilip Jangid
                                  Mar 29 '17 at 9:37














                                • 3




                                  Moving a UIView frame directly is not a great solution. Additionally this includes hardcoded values that are specific to this use case. I would encourage people to not implement a solution like this and instead do something that is closer to best practices as described in the accepted answer.
                                  – MobileVet
                                  Sep 15 '16 at 20:52










                                • @MobileVet Understood, but this is the one that works.
                                  – Tarvo Mäesepp
                                  Jan 28 '17 at 16:23










                                • amazing separate logic without changing in to our code
                                  – Dilip Jangid
                                  Mar 29 '17 at 9:37








                                3




                                3




                                Moving a UIView frame directly is not a great solution. Additionally this includes hardcoded values that are specific to this use case. I would encourage people to not implement a solution like this and instead do something that is closer to best practices as described in the accepted answer.
                                – MobileVet
                                Sep 15 '16 at 20:52




                                Moving a UIView frame directly is not a great solution. Additionally this includes hardcoded values that are specific to this use case. I would encourage people to not implement a solution like this and instead do something that is closer to best practices as described in the accepted answer.
                                – MobileVet
                                Sep 15 '16 at 20:52












                                @MobileVet Understood, but this is the one that works.
                                – Tarvo Mäesepp
                                Jan 28 '17 at 16:23




                                @MobileVet Understood, but this is the one that works.
                                – Tarvo Mäesepp
                                Jan 28 '17 at 16:23












                                amazing separate logic without changing in to our code
                                – Dilip Jangid
                                Mar 29 '17 at 9:37




                                amazing separate logic without changing in to our code
                                – Dilip Jangid
                                Mar 29 '17 at 9:37











                                7















                                Is there a way to have the screen only move when the bottom fields are edited?




                                I had a similar problem and found a pretty straightforward solution without using a scrollView, and instead using if statements within the keyboardWillShow/Hide methods.



                                func keyboardWillShow(notification: NSNotification) {
                                if bottomText.editing{
                                self.view.window?.frame.origin.y = -1 * getKeyboardHeight(notification)
                                }
                                }

                                func keyboardWillHide(notification: NSNotification) {
                                if self.view.window?.frame.origin.y != 0 {
                                self.view.window?.frame.origin.y += getKeyboardHeight(notification)
                                }
                                }


                                This was a good solution for me because I only had two text fields.



                                Shifts whole view up: only when certain text fields (bottomText) are edited



                                Shifts whole view down: only when the view is not at the original location






                                share|improve this answer




























                                  7















                                  Is there a way to have the screen only move when the bottom fields are edited?




                                  I had a similar problem and found a pretty straightforward solution without using a scrollView, and instead using if statements within the keyboardWillShow/Hide methods.



                                  func keyboardWillShow(notification: NSNotification) {
                                  if bottomText.editing{
                                  self.view.window?.frame.origin.y = -1 * getKeyboardHeight(notification)
                                  }
                                  }

                                  func keyboardWillHide(notification: NSNotification) {
                                  if self.view.window?.frame.origin.y != 0 {
                                  self.view.window?.frame.origin.y += getKeyboardHeight(notification)
                                  }
                                  }


                                  This was a good solution for me because I only had two text fields.



                                  Shifts whole view up: only when certain text fields (bottomText) are edited



                                  Shifts whole view down: only when the view is not at the original location






                                  share|improve this answer


























                                    7












                                    7








                                    7







                                    Is there a way to have the screen only move when the bottom fields are edited?




                                    I had a similar problem and found a pretty straightforward solution without using a scrollView, and instead using if statements within the keyboardWillShow/Hide methods.



                                    func keyboardWillShow(notification: NSNotification) {
                                    if bottomText.editing{
                                    self.view.window?.frame.origin.y = -1 * getKeyboardHeight(notification)
                                    }
                                    }

                                    func keyboardWillHide(notification: NSNotification) {
                                    if self.view.window?.frame.origin.y != 0 {
                                    self.view.window?.frame.origin.y += getKeyboardHeight(notification)
                                    }
                                    }


                                    This was a good solution for me because I only had two text fields.



                                    Shifts whole view up: only when certain text fields (bottomText) are edited



                                    Shifts whole view down: only when the view is not at the original location






                                    share|improve this answer















                                    Is there a way to have the screen only move when the bottom fields are edited?




                                    I had a similar problem and found a pretty straightforward solution without using a scrollView, and instead using if statements within the keyboardWillShow/Hide methods.



                                    func keyboardWillShow(notification: NSNotification) {
                                    if bottomText.editing{
                                    self.view.window?.frame.origin.y = -1 * getKeyboardHeight(notification)
                                    }
                                    }

                                    func keyboardWillHide(notification: NSNotification) {
                                    if self.view.window?.frame.origin.y != 0 {
                                    self.view.window?.frame.origin.y += getKeyboardHeight(notification)
                                    }
                                    }


                                    This was a good solution for me because I only had two text fields.



                                    Shifts whole view up: only when certain text fields (bottomText) are edited



                                    Shifts whole view down: only when the view is not at the original location







                                    share|improve this answer














                                    share|improve this answer



                                    share|improve this answer








                                    edited Apr 25 '16 at 9:00









                                    Phil Hudson

                                    2,13252550




                                    2,13252550










                                    answered Mar 20 '16 at 19:42









                                    villejacobvillejacob

                                    7115




                                    7115























                                        4














                                        Why not implement this in a UITableViewController instead? The keyboard won't hide any text fields when its shown.






                                        share|improve this answer





















                                        • this is actually the easiest and the most robust way. And it works even with controls which use a custom InputView instead of the default keyboard (UIKeyboard notifications don't work for these)
                                          – Radu Simionescu
                                          Sep 8 '15 at 7:32








                                        • 1




                                          There is the problem that you have to be careful, if the table view is embedded (rather than being "the whole page"). For anyone tripped up by that, the solution is explained in posts like this and this. Hope it helps someone dealing with the "most utterly stupid problem in all of Apple" !
                                          – Fattie
                                          Dec 6 '16 at 15:44
















                                        4














                                        Why not implement this in a UITableViewController instead? The keyboard won't hide any text fields when its shown.






                                        share|improve this answer





















                                        • this is actually the easiest and the most robust way. And it works even with controls which use a custom InputView instead of the default keyboard (UIKeyboard notifications don't work for these)
                                          – Radu Simionescu
                                          Sep 8 '15 at 7:32








                                        • 1




                                          There is the problem that you have to be careful, if the table view is embedded (rather than being "the whole page"). For anyone tripped up by that, the solution is explained in posts like this and this. Hope it helps someone dealing with the "most utterly stupid problem in all of Apple" !
                                          – Fattie
                                          Dec 6 '16 at 15:44














                                        4












                                        4








                                        4






                                        Why not implement this in a UITableViewController instead? The keyboard won't hide any text fields when its shown.






                                        share|improve this answer












                                        Why not implement this in a UITableViewController instead? The keyboard won't hide any text fields when its shown.







                                        share|improve this answer












                                        share|improve this answer



                                        share|improve this answer










                                        answered Mar 2 '15 at 15:25









                                        RJiryesRJiryes

                                        655624




                                        655624












                                        • this is actually the easiest and the most robust way. And it works even with controls which use a custom InputView instead of the default keyboard (UIKeyboard notifications don't work for these)
                                          – Radu Simionescu
                                          Sep 8 '15 at 7:32








                                        • 1




                                          There is the problem that you have to be careful, if the table view is embedded (rather than being "the whole page"). For anyone tripped up by that, the solution is explained in posts like this and this. Hope it helps someone dealing with the "most utterly stupid problem in all of Apple" !
                                          – Fattie
                                          Dec 6 '16 at 15:44


















                                        • this is actually the easiest and the most robust way. And it works even with controls which use a custom InputView instead of the default keyboard (UIKeyboard notifications don't work for these)
                                          – Radu Simionescu
                                          Sep 8 '15 at 7:32








                                        • 1




                                          There is the problem that you have to be careful, if the table view is embedded (rather than being "the whole page"). For anyone tripped up by that, the solution is explained in posts like this and this. Hope it helps someone dealing with the "most utterly stupid problem in all of Apple" !
                                          – Fattie
                                          Dec 6 '16 at 15:44
















                                        this is actually the easiest and the most robust way. And it works even with controls which use a custom InputView instead of the default keyboard (UIKeyboard notifications don't work for these)
                                        – Radu Simionescu
                                        Sep 8 '15 at 7:32






                                        this is actually the easiest and the most robust way. And it works even with controls which use a custom InputView instead of the default keyboard (UIKeyboard notifications don't work for these)
                                        – Radu Simionescu
                                        Sep 8 '15 at 7:32






                                        1




                                        1




                                        There is the problem that you have to be careful, if the table view is embedded (rather than being "the whole page"). For anyone tripped up by that, the solution is explained in posts like this and this. Hope it helps someone dealing with the "most utterly stupid problem in all of Apple" !
                                        – Fattie
                                        Dec 6 '16 at 15:44




                                        There is the problem that you have to be careful, if the table view is embedded (rather than being "the whole page"). For anyone tripped up by that, the solution is explained in posts like this and this. Hope it helps someone dealing with the "most utterly stupid problem in all of Apple" !
                                        – Fattie
                                        Dec 6 '16 at 15:44











                                        3














                                        Just use this extension to move any UIView when keyboard is presented.



                                             extension UIView {
                                        func bindToKeyboard(){
                                        NotificationCenter.default.addObserver(self, selector: #selector(self.keyboardWillChange(_:)), name: NSNotification.Name.UIKeyboardWillChangeFrame, object: nil)
                                        }

                                        @objc func keyboardWillChange(_ notification: NSNotification){
                                        let duration = notification.userInfo![UIKeyboardAnimationDurationUserInfoKey] as! Double
                                        let curve = notification.userInfo![UIKeyboardAnimationCurveUserInfoKey] as! UInt
                                        let beginningFrame = (notification.userInfo![UIKeyboardFrameBeginUserInfoKey] as! NSValue).cgRectValue
                                        let endFrame = (notification.userInfo![UIKeyboardFrameEndUserInfoKey] as! NSValue).cgRectValue



                                        let deltaY = endFrame.origin.y - beginningFrame.origin.y

                                        UIView.animateKeyframes(withDuration: duration, delay: 0.0, options: UIViewKeyframeAnimationOptions(rawValue: curve), animations: {
                                        self.frame.origin.y += deltaY
                                        }, completion: nil)
                                        }
                                        }


                                        Then in your viewdidload bind your view to the keyboard



                                        UiView.bindToKeyboard()





                                        share|improve this answer





















                                        • Good example with extension
                                          – abdul sathar
                                          May 8 '18 at 11:39










                                        • Excellent, thanks a lot !!!
                                          – Ricky Youssef
                                          May 26 '18 at 7:20










                                        • This moves the view up even if it is not needed and if the textfield is at the top of view it will go up and will not be visible. This is not a good solution.
                                          – Shivam Pokhriyal
                                          Aug 31 '18 at 18:27
















                                        3














                                        Just use this extension to move any UIView when keyboard is presented.



                                             extension UIView {
                                        func bindToKeyboard(){
                                        NotificationCenter.default.addObserver(self, selector: #selector(self.keyboardWillChange(_:)), name: NSNotification.Name.UIKeyboardWillChangeFrame, object: nil)
                                        }

                                        @objc func keyboardWillChange(_ notification: NSNotification){
                                        let duration = notification.userInfo![UIKeyboardAnimationDurationUserInfoKey] as! Double
                                        let curve = notification.userInfo![UIKeyboardAnimationCurveUserInfoKey] as! UInt
                                        let beginningFrame = (notification.userInfo![UIKeyboardFrameBeginUserInfoKey] as! NSValue).cgRectValue
                                        let endFrame = (notification.userInfo![UIKeyboardFrameEndUserInfoKey] as! NSValue).cgRectValue



                                        let deltaY = endFrame.origin.y - beginningFrame.origin.y

                                        UIView.animateKeyframes(withDuration: duration, delay: 0.0, options: UIViewKeyframeAnimationOptions(rawValue: curve), animations: {
                                        self.frame.origin.y += deltaY
                                        }, completion: nil)
                                        }
                                        }


                                        Then in your viewdidload bind your view to the keyboard



                                        UiView.bindToKeyboard()





                                        share|improve this answer





















                                        • Good example with extension
                                          – abdul sathar
                                          May 8 '18 at 11:39










                                        • Excellent, thanks a lot !!!
                                          – Ricky Youssef
                                          May 26 '18 at 7:20










                                        • This moves the view up even if it is not needed and if the textfield is at the top of view it will go up and will not be visible. This is not a good solution.
                                          – Shivam Pokhriyal
                                          Aug 31 '18 at 18:27














                                        3












                                        3








                                        3






                                        Just use this extension to move any UIView when keyboard is presented.



                                             extension UIView {
                                        func bindToKeyboard(){
                                        NotificationCenter.default.addObserver(self, selector: #selector(self.keyboardWillChange(_:)), name: NSNotification.Name.UIKeyboardWillChangeFrame, object: nil)
                                        }

                                        @objc func keyboardWillChange(_ notification: NSNotification){
                                        let duration = notification.userInfo![UIKeyboardAnimationDurationUserInfoKey] as! Double
                                        let curve = notification.userInfo![UIKeyboardAnimationCurveUserInfoKey] as! UInt
                                        let beginningFrame = (notification.userInfo![UIKeyboardFrameBeginUserInfoKey] as! NSValue).cgRectValue
                                        let endFrame = (notification.userInfo![UIKeyboardFrameEndUserInfoKey] as! NSValue).cgRectValue



                                        let deltaY = endFrame.origin.y - beginningFrame.origin.y

                                        UIView.animateKeyframes(withDuration: duration, delay: 0.0, options: UIViewKeyframeAnimationOptions(rawValue: curve), animations: {
                                        self.frame.origin.y += deltaY
                                        }, completion: nil)
                                        }
                                        }


                                        Then in your viewdidload bind your view to the keyboard



                                        UiView.bindToKeyboard()





                                        share|improve this answer












                                        Just use this extension to move any UIView when keyboard is presented.



                                             extension UIView {
                                        func bindToKeyboard(){
                                        NotificationCenter.default.addObserver(self, selector: #selector(self.keyboardWillChange(_:)), name: NSNotification.Name.UIKeyboardWillChangeFrame, object: nil)
                                        }

                                        @objc func keyboardWillChange(_ notification: NSNotification){
                                        let duration = notification.userInfo![UIKeyboardAnimationDurationUserInfoKey] as! Double
                                        let curve = notification.userInfo![UIKeyboardAnimationCurveUserInfoKey] as! UInt
                                        let beginningFrame = (notification.userInfo![UIKeyboardFrameBeginUserInfoKey] as! NSValue).cgRectValue
                                        let endFrame = (notification.userInfo![UIKeyboardFrameEndUserInfoKey] as! NSValue).cgRectValue



                                        let deltaY = endFrame.origin.y - beginningFrame.origin.y

                                        UIView.animateKeyframes(withDuration: duration, delay: 0.0, options: UIViewKeyframeAnimationOptions(rawValue: curve), animations: {
                                        self.frame.origin.y += deltaY
                                        }, completion: nil)
                                        }
                                        }


                                        Then in your viewdidload bind your view to the keyboard



                                        UiView.bindToKeyboard()






                                        share|improve this answer












                                        share|improve this answer



                                        share|improve this answer










                                        answered Apr 11 '18 at 12:19









                                        Bilal MustafaBilal Mustafa

                                        1326




                                        1326












                                        • Good example with extension
                                          – abdul sathar
                                          May 8 '18 at 11:39










                                        • Excellent, thanks a lot !!!
                                          – Ricky Youssef
                                          May 26 '18 at 7:20










                                        • This moves the view up even if it is not needed and if the textfield is at the top of view it will go up and will not be visible. This is not a good solution.
                                          – Shivam Pokhriyal
                                          Aug 31 '18 at 18:27


















                                        • Good example with extension
                                          – abdul sathar
                                          May 8 '18 at 11:39










                                        • Excellent, thanks a lot !!!
                                          – Ricky Youssef
                                          May 26 '18 at 7:20










                                        • This moves the view up even if it is not needed and if the textfield is at the top of view it will go up and will not be visible. This is not a good solution.
                                          – Shivam Pokhriyal
                                          Aug 31 '18 at 18:27
















                                        Good example with extension
                                        – abdul sathar
                                        May 8 '18 at 11:39




                                        Good example with extension
                                        – abdul sathar
                                        May 8 '18 at 11:39












                                        Excellent, thanks a lot !!!
                                        – Ricky Youssef
                                        May 26 '18 at 7:20




                                        Excellent, thanks a lot !!!
                                        – Ricky Youssef
                                        May 26 '18 at 7:20












                                        This moves the view up even if it is not needed and if the textfield is at the top of view it will go up and will not be visible. This is not a good solution.
                                        – Shivam Pokhriyal
                                        Aug 31 '18 at 18:27




                                        This moves the view up even if it is not needed and if the textfield is at the top of view it will go up and will not be visible. This is not a good solution.
                                        – Shivam Pokhriyal
                                        Aug 31 '18 at 18:27











                                        3














                                        Swift 4 (**updated) with extension**




                                        1. add the buttons in one container

                                        2. connect bottom constraint of the container with IBOutlet containerBtmConstrain


                                        3. inViewDidLoad



                                          self.containerDependOnKeyboardBottomConstrain = containerBtmConstrain
                                          self.watchForKeyboard()



                                        4. add the following extension



                                          import UIKit

                                          private var xoAssociationKeyForBottomConstrainInVC: UInt8 = 0

                                          extension UIViewController {

                                          var containerDependOnKeyboardBottomConstrain :NSLayoutConstraint! {
                                          get {
                                          return objc_getAssociatedObject(self, &xoAssociationKeyForBottomConstrainInVC) as? NSLayoutConstraint
                                          }
                                          set(newValue) {
                                          objc_setAssociatedObject(self, &xoAssociationKeyForBottomConstrainInVC, newValue, objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN)
                                          }
                                          }

                                          func watchForKeyboard () {
                                          NotificationCenter.default.addObserver(self, selector: #selector(self.keyboardWasShown(notification:)), name:UIResponder.keyboardWillShowNotification, object: nil);
                                          NotificationCenter.default.addObserver(self, selector: #selector(self.keyboardWillHide(notification:)), name:UIResponder.keyboardWillHideNotification, object: nil);
                                          }

                                          @objc func keyboardWasShown(notification: NSNotification) {
                                          let info = notification.userInfo!
                                          let keyboardFrame: CGRect = (info[UIResponder.keyboardFrameEndUserInfoKey] as! NSValue).cgRectValue

                                          UIView.animate(withDuration: 0.3, animations: { () -> Void in
                                          self.containerDependOnKeyboardBottomConstrain.constant = -keyboardFrame.height
                                          self.view.layoutIfNeeded()
                                          })
                                          }

                                          @objc func keyboardWillHide(notification: NSNotification) {
                                          UIView.animate(withDuration: 0.3, animations: { () -> Void in
                                          self.containerDependOnKeyboardBottomConstrain.constant = 0
                                          self.view.layoutIfNeeded()
                                          })
                                          }
                                          }







                                        share|improve this answer



















                                        • 1




                                          Thanks, mate. It's all about the right key. I was using UIKeyboardFrameBeginUserInfoKey and now using UIKeyboardFrameEndUserInfoKey handles it gracefully.
                                          – Felipe
                                          Sep 21 '17 at 0:21
















                                        3














                                        Swift 4 (**updated) with extension**




                                        1. add the buttons in one container

                                        2. connect bottom constraint of the container with IBOutlet containerBtmConstrain


                                        3. inViewDidLoad



                                          self.containerDependOnKeyboardBottomConstrain = containerBtmConstrain
                                          self.watchForKeyboard()



                                        4. add the following extension



                                          import UIKit

                                          private var xoAssociationKeyForBottomConstrainInVC: UInt8 = 0

                                          extension UIViewController {

                                          var containerDependOnKeyboardBottomConstrain :NSLayoutConstraint! {
                                          get {
                                          return objc_getAssociatedObject(self, &xoAssociationKeyForBottomConstrainInVC) as? NSLayoutConstraint
                                          }
                                          set(newValue) {
                                          objc_setAssociatedObject(self, &xoAssociationKeyForBottomConstrainInVC, newValue, objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN)
                                          }
                                          }

                                          func watchForKeyboard () {
                                          NotificationCenter.default.addObserver(self, selector: #selector(self.keyboardWasShown(notification:)), name:UIResponder.keyboardWillShowNotification, object: nil);
                                          NotificationCenter.default.addObserver(self, selector: #selector(self.keyboardWillHide(notification:)), name:UIResponder.keyboardWillHideNotification, object: nil);
                                          }

                                          @objc func keyboardWasShown(notification: NSNotification) {
                                          let info = notification.userInfo!
                                          let keyboardFrame: CGRect = (info[UIResponder.keyboardFrameEndUserInfoKey] as! NSValue).cgRectValue

                                          UIView.animate(withDuration: 0.3, animations: { () -> Void in
                                          self.containerDependOnKeyboardBottomConstrain.constant = -keyboardFrame.height
                                          self.view.layoutIfNeeded()
                                          })
                                          }

                                          @objc func keyboardWillHide(notification: NSNotification) {
                                          UIView.animate(withDuration: 0.3, animations: { () -> Void in
                                          self.containerDependOnKeyboardBottomConstrain.constant = 0
                                          self.view.layoutIfNeeded()
                                          })
                                          }
                                          }







                                        share|improve this answer



















                                        • 1




                                          Thanks, mate. It's all about the right key. I was using UIKeyboardFrameBeginUserInfoKey and now using UIKeyboardFrameEndUserInfoKey handles it gracefully.
                                          – Felipe
                                          Sep 21 '17 at 0:21














                                        3












                                        3








                                        3






                                        Swift 4 (**updated) with extension**




                                        1. add the buttons in one container

                                        2. connect bottom constraint of the container with IBOutlet containerBtmConstrain


                                        3. inViewDidLoad



                                          self.containerDependOnKeyboardBottomConstrain = containerBtmConstrain
                                          self.watchForKeyboard()



                                        4. add the following extension



                                          import UIKit

                                          private var xoAssociationKeyForBottomConstrainInVC: UInt8 = 0

                                          extension UIViewController {

                                          var containerDependOnKeyboardBottomConstrain :NSLayoutConstraint! {
                                          get {
                                          return objc_getAssociatedObject(self, &xoAssociationKeyForBottomConstrainInVC) as? NSLayoutConstraint
                                          }
                                          set(newValue) {
                                          objc_setAssociatedObject(self, &xoAssociationKeyForBottomConstrainInVC, newValue, objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN)
                                          }
                                          }

                                          func watchForKeyboard () {
                                          NotificationCenter.default.addObserver(self, selector: #selector(self.keyboardWasShown(notification:)), name:UIResponder.keyboardWillShowNotification, object: nil);
                                          NotificationCenter.default.addObserver(self, selector: #selector(self.keyboardWillHide(notification:)), name:UIResponder.keyboardWillHideNotification, object: nil);
                                          }

                                          @objc func keyboardWasShown(notification: NSNotification) {
                                          let info = notification.userInfo!
                                          let keyboardFrame: CGRect = (info[UIResponder.keyboardFrameEndUserInfoKey] as! NSValue).cgRectValue

                                          UIView.animate(withDuration: 0.3, animations: { () -> Void in
                                          self.containerDependOnKeyboardBottomConstrain.constant = -keyboardFrame.height
                                          self.view.layoutIfNeeded()
                                          })
                                          }

                                          @objc func keyboardWillHide(notification: NSNotification) {
                                          UIView.animate(withDuration: 0.3, animations: { () -> Void in
                                          self.containerDependOnKeyboardBottomConstrain.constant = 0
                                          self.view.layoutIfNeeded()
                                          })
                                          }
                                          }







                                        share|improve this answer














                                        Swift 4 (**updated) with extension**




                                        1. add the buttons in one container

                                        2. connect bottom constraint of the container with IBOutlet containerBtmConstrain


                                        3. inViewDidLoad



                                          self.containerDependOnKeyboardBottomConstrain = containerBtmConstrain
                                          self.watchForKeyboard()



                                        4. add the following extension



                                          import UIKit

                                          private var xoAssociationKeyForBottomConstrainInVC: UInt8 = 0

                                          extension UIViewController {

                                          var containerDependOnKeyboardBottomConstrain :NSLayoutConstraint! {
                                          get {
                                          return objc_getAssociatedObject(self, &xoAssociationKeyForBottomConstrainInVC) as? NSLayoutConstraint
                                          }
                                          set(newValue) {
                                          objc_setAssociatedObject(self, &xoAssociationKeyForBottomConstrainInVC, newValue, objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN)
                                          }
                                          }

                                          func watchForKeyboard () {
                                          NotificationCenter.default.addObserver(self, selector: #selector(self.keyboardWasShown(notification:)), name:UIResponder.keyboardWillShowNotification, object: nil);
                                          NotificationCenter.default.addObserver(self, selector: #selector(self.keyboardWillHide(notification:)), name:UIResponder.keyboardWillHideNotification, object: nil);
                                          }

                                          @objc func keyboardWasShown(notification: NSNotification) {
                                          let info = notification.userInfo!
                                          let keyboardFrame: CGRect = (info[UIResponder.keyboardFrameEndUserInfoKey] as! NSValue).cgRectValue

                                          UIView.animate(withDuration: 0.3, animations: { () -> Void in
                                          self.containerDependOnKeyboardBottomConstrain.constant = -keyboardFrame.height
                                          self.view.layoutIfNeeded()
                                          })
                                          }

                                          @objc func keyboardWillHide(notification: NSNotification) {
                                          UIView.animate(withDuration: 0.3, animations: { () -> Void in
                                          self.containerDependOnKeyboardBottomConstrain.constant = 0
                                          self.view.layoutIfNeeded()
                                          })
                                          }
                                          }








                                        share|improve this answer














                                        share|improve this answer



                                        share|improve this answer








                                        edited Sep 28 '18 at 9:57

























                                        answered Mar 31 '17 at 10:56









                                        iluvatar_GRiluvatar_GR

                                        459612




                                        459612








                                        • 1




                                          Thanks, mate. It's all about the right key. I was using UIKeyboardFrameBeginUserInfoKey and now using UIKeyboardFrameEndUserInfoKey handles it gracefully.
                                          – Felipe
                                          Sep 21 '17 at 0:21














                                        • 1




                                          Thanks, mate. It's all about the right key. I was using UIKeyboardFrameBeginUserInfoKey and now using UIKeyboardFrameEndUserInfoKey handles it gracefully.
                                          – Felipe
                                          Sep 21 '17 at 0:21








                                        1




                                        1




                                        Thanks, mate. It's all about the right key. I was using UIKeyboardFrameBeginUserInfoKey and now using UIKeyboardFrameEndUserInfoKey handles it gracefully.
                                        – Felipe
                                        Sep 21 '17 at 0:21




                                        Thanks, mate. It's all about the right key. I was using UIKeyboardFrameBeginUserInfoKey and now using UIKeyboardFrameEndUserInfoKey handles it gracefully.
                                        – Felipe
                                        Sep 21 '17 at 0:21











                                        2














                                        I think this clause is wrong:



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


                                        While the activeField's origin may well be above the keyboard, the maxY might not...



                                        I would create a 'max' point for the activeField and check if that is in the keyboard Rect.






                                        share|improve this answer




























                                          2














                                          I think this clause is wrong:



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


                                          While the activeField's origin may well be above the keyboard, the maxY might not...



                                          I would create a 'max' point for the activeField and check if that is in the keyboard Rect.






                                          share|improve this answer


























                                            2












                                            2








                                            2






                                            I think this clause is wrong:



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


                                            While the activeField's origin may well be above the keyboard, the maxY might not...



                                            I would create a 'max' point for the activeField and check if that is in the keyboard Rect.






                                            share|improve this answer














                                            I think this clause is wrong:



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


                                            While the activeField's origin may well be above the keyboard, the maxY might not...



                                            I would create a 'max' point for the activeField and check if that is in the keyboard Rect.







                                            share|improve this answer














                                            share|improve this answer



                                            share|improve this answer








                                            edited Sep 2 '15 at 18:19

























                                            answered Sep 2 '15 at 18:04









                                            goggeljgoggelj

                                            1,28711423




                                            1,28711423























                                                2














                                                I use SwiftLint, which had a few issues with the formatting of the accepted answer. Specifically:



                                                no space before the colon,
                                                no force casting,
                                                prefer UIEdgeInset(top: etc... instead of UIEdgeInsetMake.



                                                so here are those updates for Swift 3



                                                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
                                                scrollView?.isScrollEnabled = true
                                                var info = notification.userInfo!
                                                if let keyboardSize = (info[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue.size {
                                                let contentInsets: UIEdgeInsets = UIEdgeInsets(top: 0.0, left: 0.0, bottom: keyboardSize.height, right: 0.0)

                                                scrollView?.contentInset = contentInsets
                                                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!
                                                if let keyboardSize = (info[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue.size {
                                                let contentInsets: UIEdgeInsets = UIEdgeInsets(top: 0.0, left: 0.0, bottom: -keyboardSize.height, right: 0.0)
                                                scrollView?.contentInset = contentInsets
                                                scrollView?.scrollIndicatorInsets = contentInsets
                                                }

                                                view.endEditing(true)
                                                scrollView?.isScrollEnabled = false
                                                }

                                                func textFieldDidBeginEditing(_ textField: UITextField) {
                                                activeField = textField
                                                }

                                                func textFieldDidEndEditing(_ textField: UITextField) {
                                                activeField = nil
                                                }





                                                share|improve this answer


























                                                  2














                                                  I use SwiftLint, which had a few issues with the formatting of the accepted answer. Specifically:



                                                  no space before the colon,
                                                  no force casting,
                                                  prefer UIEdgeInset(top: etc... instead of UIEdgeInsetMake.



                                                  so here are those updates for Swift 3



                                                  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
                                                  scrollView?.isScrollEnabled = true
                                                  var info = notification.userInfo!
                                                  if let keyboardSize = (info[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue.size {
                                                  let contentInsets: UIEdgeInsets = UIEdgeInsets(top: 0.0, left: 0.0, bottom: keyboardSize.height, right: 0.0)

                                                  scrollView?.contentInset = contentInsets
                                                  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!
                                                  if let keyboardSize = (info[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue.size {
                                                  let contentInsets: UIEdgeInsets = UIEdgeInsets(top: 0.0, left: 0.0, bottom: -keyboardSize.height, right: 0.0)
                                                  scrollView?.contentInset = contentInsets
                                                  scrollView?.scrollIndicatorInsets = contentInsets
                                                  }

                                                  view.endEditing(true)
                                                  scrollView?.isScrollEnabled = false
                                                  }

                                                  func textFieldDidBeginEditing(_ textField: UITextField) {
                                                  activeField = textField
                                                  }

                                                  func textFieldDidEndEditing(_ textField: UITextField) {
                                                  activeField = nil
                                                  }





                                                  share|improve this answer
























                                                    2












                                                    2








                                                    2






                                                    I use SwiftLint, which had a few issues with the formatting of the accepted answer. Specifically:



                                                    no space before the colon,
                                                    no force casting,
                                                    prefer UIEdgeInset(top: etc... instead of UIEdgeInsetMake.



                                                    so here are those updates for Swift 3



                                                    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
                                                    scrollView?.isScrollEnabled = true
                                                    var info = notification.userInfo!
                                                    if let keyboardSize = (info[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue.size {
                                                    let contentInsets: UIEdgeInsets = UIEdgeInsets(top: 0.0, left: 0.0, bottom: keyboardSize.height, right: 0.0)

                                                    scrollView?.contentInset = contentInsets
                                                    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!
                                                    if let keyboardSize = (info[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue.size {
                                                    let contentInsets: UIEdgeInsets = UIEdgeInsets(top: 0.0, left: 0.0, bottom: -keyboardSize.height, right: 0.0)
                                                    scrollView?.contentInset = contentInsets
                                                    scrollView?.scrollIndicatorInsets = contentInsets
                                                    }

                                                    view.endEditing(true)
                                                    scrollView?.isScrollEnabled = false
                                                    }

                                                    func textFieldDidBeginEditing(_ textField: UITextField) {
                                                    activeField = textField
                                                    }

                                                    func textFieldDidEndEditing(_ textField: UITextField) {
                                                    activeField = nil
                                                    }





                                                    share|improve this answer












                                                    I use SwiftLint, which had a few issues with the formatting of the accepted answer. Specifically:



                                                    no space before the colon,
                                                    no force casting,
                                                    prefer UIEdgeInset(top: etc... instead of UIEdgeInsetMake.



                                                    so here are those updates for Swift 3



                                                    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
                                                    scrollView?.isScrollEnabled = true
                                                    var info = notification.userInfo!
                                                    if let keyboardSize = (info[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue.size {
                                                    let contentInsets: UIEdgeInsets = UIEdgeInsets(top: 0.0, left: 0.0, bottom: keyboardSize.height, right: 0.0)

                                                    scrollView?.contentInset = contentInsets
                                                    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!
                                                    if let keyboardSize = (info[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue.size {
                                                    let contentInsets: UIEdgeInsets = UIEdgeInsets(top: 0.0, left: 0.0, bottom: -keyboardSize.height, right: 0.0)
                                                    scrollView?.contentInset = contentInsets
                                                    scrollView?.scrollIndicatorInsets = contentInsets
                                                    }

                                                    view.endEditing(true)
                                                    scrollView?.isScrollEnabled = false
                                                    }

                                                    func textFieldDidBeginEditing(_ textField: UITextField) {
                                                    activeField = textField
                                                    }

                                                    func textFieldDidEndEditing(_ textField: UITextField) {
                                                    activeField = nil
                                                    }






                                                    share|improve this answer












                                                    share|improve this answer



                                                    share|improve this answer










                                                    answered Mar 9 '17 at 18:01









                                                    Joe HoffmanJoe Hoffman

                                                    212




                                                    212























                                                        1














                                                        Here's my version after reading the documentation provided by Apple and the previous posts. One thing I noticed is that the textView was not handled when covered by the keyboard. Unfortunately, Apple's documentation won't work because, for whatever reason, the keyboard is called AFTER the textViewDidBeginEditing is called. I handled this by calling a central method that checks if the keyboard is displayed AND if a textView or textField is being edited. This way, the process is only fired when BOTH conditions exists.



                                                        Another point with textViews is that their height may be such that the keyboard clips the bottom of the textView and would not adjust if the Top-Left point of the was in view. So, the code I wrote actually takes the screen-referenced Bottom-Left point of any textView or textField and sees if it falls in the screen-referenced coordinates of the presented keyboard implying that the keyboard covers some portion of it.



                                                        let aRect : CGRect = scrollView.convertRect(activeFieldRect!, toView: nil)
                                                        if (CGRectContainsPoint(keyboardRect!, CGPointMake(aRect.origin.x, aRect.maxY))) {
                                                        // scroll textView/textField into view
                                                        }


                                                        If you're using a navigation controller, the subclass also sets the scroll view automatic adjustment for insets to false.



                                                        self.automaticallyAdjustsScrollViewInsets = false


                                                        It walks through each textView and textField to set delegates for handling



                                                            for view in self.view.subviews {
                                                        if view is UITextView {
                                                        let tv = view as! UITextView
                                                        tv.delegate = self
                                                        } else if view is UITextField {
                                                        let tf = view as! UITextField
                                                        tf.delegate = self
                                                        }
                                                        }


                                                        Simply set your base class to the subclass created here for results.



                                                        import UIKit

                                                        class ScrollingFormViewController: UIViewController, UITextViewDelegate, UITextFieldDelegate {

                                                        var activeFieldRect: CGRect?
                                                        var keyboardRect: CGRect?
                                                        var scrollView: UIScrollView!

                                                        override func viewDidLoad() {

                                                        self.automaticallyAdjustsScrollViewInsets = false

                                                        super.viewDidLoad()

                                                        // Do any additional setup after loading the view.
                                                        self.registerForKeyboardNotifications()
                                                        for view in self.view.subviews {
                                                        if view is UITextView {
                                                        let tv = view as! UITextView
                                                        tv.delegate = self
                                                        } else if view is UITextField {
                                                        let tf = view as! UITextField
                                                        tf.delegate = self
                                                        }
                                                        }
                                                        scrollView = UIScrollView(frame: self.view.frame)
                                                        scrollView.scrollEnabled = false
                                                        scrollView.showsVerticalScrollIndicator = false
                                                        scrollView.showsHorizontalScrollIndicator = false
                                                        scrollView.addSubview(self.view)
                                                        self.view = scrollView
                                                        }

                                                        override func viewDidLayoutSubviews() {
                                                        scrollView.sizeToFit()
                                                        scrollView.contentSize = scrollView.frame.size
                                                        super.viewDidLayoutSubviews()
                                                        }

                                                        deinit {
                                                        self.deregisterFromKeyboardNotifications()
                                                        }

                                                        override func didReceiveMemoryWarning() {
                                                        super.didReceiveMemoryWarning()
                                                        // Dispose of any resources that can be recreated.
                                                        }


                                                        func registerForKeyboardNotifications()
                                                        {
                                                        //Adding notifies on keyboard appearing
                                                        NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(ScrollingFormViewController.keyboardWasShown), name: UIKeyboardWillShowNotification, object: nil)
                                                        NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(ScrollingFormViewController.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)
                                                        {
                                                        let info : NSDictionary = notification.userInfo!
                                                        keyboardRect = (info[UIKeyboardFrameEndUserInfoKey] as? NSValue)?.CGRectValue()
                                                        adjustForKeyboard()
                                                        }


                                                        func keyboardWillBeHidden(notification: NSNotification)
                                                        {
                                                        keyboardRect = nil
                                                        adjustForKeyboard()
                                                        }

                                                        func adjustForKeyboard() {
                                                        if keyboardRect != nil && activeFieldRect != nil {
                                                        let aRect : CGRect = scrollView.convertRect(activeFieldRect!, toView: nil)
                                                        if (CGRectContainsPoint(keyboardRect!, CGPointMake(aRect.origin.x, aRect.maxY)))
                                                        {
                                                        scrollView.scrollEnabled = true
                                                        let contentInsets : UIEdgeInsets = UIEdgeInsetsMake(0.0, 0.0, keyboardRect!.size.height, 0.0)
                                                        scrollView.contentInset = contentInsets
                                                        scrollView.scrollIndicatorInsets = contentInsets
                                                        scrollView.scrollRectToVisible(activeFieldRect!, animated: true)
                                                        }
                                                        } else {
                                                        let contentInsets : UIEdgeInsets = UIEdgeInsetsZero
                                                        scrollView.contentInset = contentInsets
                                                        scrollView.scrollIndicatorInsets = contentInsets
                                                        scrollView.scrollEnabled = false
                                                        }
                                                        }

                                                        func textViewDidBeginEditing(textView: UITextView) {
                                                        activeFieldRect = textView.frame
                                                        adjustForKeyboard()
                                                        }

                                                        func textViewDidEndEditing(textView: UITextView) {
                                                        activeFieldRect = nil
                                                        adjustForKeyboard()
                                                        }

                                                        func textFieldDidBeginEditing(textField: UITextField)
                                                        {
                                                        activeFieldRect = textField.frame
                                                        adjustForKeyboard()
                                                        }

                                                        func textFieldDidEndEditing(textField: UITextField)
                                                        {
                                                        activeFieldRect = nil
                                                        adjustForKeyboard()
                                                        }

                                                        }





                                                        share|improve this answer


























                                                          1














                                                          Here's my version after reading the documentation provided by Apple and the previous posts. One thing I noticed is that the textView was not handled when covered by the keyboard. Unfortunately, Apple's documentation won't work because, for whatever reason, the keyboard is called AFTER the textViewDidBeginEditing is called. I handled this by calling a central method that checks if the keyboard is displayed AND if a textView or textField is being edited. This way, the process is only fired when BOTH conditions exists.



                                                          Another point with textViews is that their height may be such that the keyboard clips the bottom of the textView and would not adjust if the Top-Left point of the was in view. So, the code I wrote actually takes the screen-referenced Bottom-Left point of any textView or textField and sees if it falls in the screen-referenced coordinates of the presented keyboard implying that the keyboard covers some portion of it.



                                                          let aRect : CGRect = scrollView.convertRect(activeFieldRect!, toView: nil)
                                                          if (CGRectContainsPoint(keyboardRect!, CGPointMake(aRect.origin.x, aRect.maxY))) {
                                                          // scroll textView/textField into view
                                                          }


                                                          If you're using a navigation controller, the subclass also sets the scroll view automatic adjustment for insets to false.



                                                          self.automaticallyAdjustsScrollViewInsets = false


                                                          It walks through each textView and textField to set delegates for handling



                                                              for view in self.view.subviews {
                                                          if view is UITextView {
                                                          let tv = view as! UITextView
                                                          tv.delegate = self
                                                          } else if view is UITextField {
                                                          let tf = view as! UITextField
                                                          tf.delegate = self
                                                          }
                                                          }


                                                          Simply set your base class to the subclass created here for results.



                                                          import UIKit

                                                          class ScrollingFormViewController: UIViewController, UITextViewDelegate, UITextFieldDelegate {

                                                          var activeFieldRect: CGRect?
                                                          var keyboardRect: CGRect?
                                                          var scrollView: UIScrollView!

                                                          override func viewDidLoad() {

                                                          self.automaticallyAdjustsScrollViewInsets = false

                                                          super.viewDidLoad()

                                                          // Do any additional setup after loading the view.
                                                          self.registerForKeyboardNotifications()
                                                          for view in self.view.subviews {
                                                          if view is UITextView {
                                                          let tv = view as! UITextView
                                                          tv.delegate = self
                                                          } else if view is UITextField {
                                                          let tf = view as! UITextField
                                                          tf.delegate = self
                                                          }
                                                          }
                                                          scrollView = UIScrollView(frame: self.view.frame)
                                                          scrollView.scrollEnabled = false
                                                          scrollView.showsVerticalScrollIndicator = false
                                                          scrollView.showsHorizontalScrollIndicator = false
                                                          scrollView.addSubview(self.view)
                                                          self.view = scrollView
                                                          }

                                                          override func viewDidLayoutSubviews() {
                                                          scrollView.sizeToFit()
                                                          scrollView.contentSize = scrollView.frame.size
                                                          super.viewDidLayoutSubviews()
                                                          }

                                                          deinit {
                                                          self.deregisterFromKeyboardNotifications()
                                                          }

                                                          override func didReceiveMemoryWarning() {
                                                          super.didReceiveMemoryWarning()
                                                          // Dispose of any resources that can be recreated.
                                                          }


                                                          func registerForKeyboardNotifications()
                                                          {
                                                          //Adding notifies on keyboard appearing
                                                          NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(ScrollingFormViewController.keyboardWasShown), name: UIKeyboardWillShowNotification, object: nil)
                                                          NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(ScrollingFormViewController.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)
                                                          {
                                                          let info : NSDictionary = notification.userInfo!
                                                          keyboardRect = (info[UIKeyboardFrameEndUserInfoKey] as? NSValue)?.CGRectValue()
                                                          adjustForKeyboard()
                                                          }


                                                          func keyboardWillBeHidden(notification: NSNotification)
                                                          {
                                                          keyboardRect = nil
                                                          adjustForKeyboard()
                                                          }

                                                          func adjustForKeyboard() {
                                                          if keyboardRect != nil && activeFieldRect != nil {
                                                          let aRect : CGRect = scrollView.convertRect(activeFieldRect!, toView: nil)
                                                          if (CGRectContainsPoint(keyboardRect!, CGPointMake(aRect.origin.x, aRect.maxY)))
                                                          {
                                                          scrollView.scrollEnabled = true
                                                          let contentInsets : UIEdgeInsets = UIEdgeInsetsMake(0.0, 0.0, keyboardRect!.size.height, 0.0)
                                                          scrollView.contentInset = contentInsets
                                                          scrollView.scrollIndicatorInsets = contentInsets
                                                          scrollView.scrollRectToVisible(activeFieldRect!, animated: true)
                                                          }
                                                          } else {
                                                          let contentInsets : UIEdgeInsets = UIEdgeInsetsZero
                                                          scrollView.contentInset = contentInsets
                                                          scrollView.scrollIndicatorInsets = contentInsets
                                                          scrollView.scrollEnabled = false
                                                          }
                                                          }

                                                          func textViewDidBeginEditing(textView: UITextView) {
                                                          activeFieldRect = textView.frame
                                                          adjustForKeyboard()
                                                          }

                                                          func textViewDidEndEditing(textView: UITextView) {
                                                          activeFieldRect = nil
                                                          adjustForKeyboard()
                                                          }

                                                          func textFieldDidBeginEditing(textField: UITextField)
                                                          {
                                                          activeFieldRect = textField.frame
                                                          adjustForKeyboard()
                                                          }

                                                          func textFieldDidEndEditing(textField: UITextField)
                                                          {
                                                          activeFieldRect = nil
                                                          adjustForKeyboard()
                                                          }

                                                          }





                                                          share|improve this answer
























                                                            1












                                                            1








                                                            1






                                                            Here's my version after reading the documentation provided by Apple and the previous posts. One thing I noticed is that the textView was not handled when covered by the keyboard. Unfortunately, Apple's documentation won't work because, for whatever reason, the keyboard is called AFTER the textViewDidBeginEditing is called. I handled this by calling a central method that checks if the keyboard is displayed AND if a textView or textField is being edited. This way, the process is only fired when BOTH conditions exists.



                                                            Another point with textViews is that their height may be such that the keyboard clips the bottom of the textView and would not adjust if the Top-Left point of the was in view. So, the code I wrote actually takes the screen-referenced Bottom-Left point of any textView or textField and sees if it falls in the screen-referenced coordinates of the presented keyboard implying that the keyboard covers some portion of it.



                                                            let aRect : CGRect = scrollView.convertRect(activeFieldRect!, toView: nil)
                                                            if (CGRectContainsPoint(keyboardRect!, CGPointMake(aRect.origin.x, aRect.maxY))) {
                                                            // scroll textView/textField into view
                                                            }


                                                            If you're using a navigation controller, the subclass also sets the scroll view automatic adjustment for insets to false.



                                                            self.automaticallyAdjustsScrollViewInsets = false


                                                            It walks through each textView and textField to set delegates for handling



                                                                for view in self.view.subviews {
                                                            if view is UITextView {
                                                            let tv = view as! UITextView
                                                            tv.delegate = self
                                                            } else if view is UITextField {
                                                            let tf = view as! UITextField
                                                            tf.delegate = self
                                                            }
                                                            }


                                                            Simply set your base class to the subclass created here for results.



                                                            import UIKit

                                                            class ScrollingFormViewController: UIViewController, UITextViewDelegate, UITextFieldDelegate {

                                                            var activeFieldRect: CGRect?
                                                            var keyboardRect: CGRect?
                                                            var scrollView: UIScrollView!

                                                            override func viewDidLoad() {

                                                            self.automaticallyAdjustsScrollViewInsets = false

                                                            super.viewDidLoad()

                                                            // Do any additional setup after loading the view.
                                                            self.registerForKeyboardNotifications()
                                                            for view in self.view.subviews {
                                                            if view is UITextView {
                                                            let tv = view as! UITextView
                                                            tv.delegate = self
                                                            } else if view is UITextField {
                                                            let tf = view as! UITextField
                                                            tf.delegate = self
                                                            }
                                                            }
                                                            scrollView = UIScrollView(frame: self.view.frame)
                                                            scrollView.scrollEnabled = false
                                                            scrollView.showsVerticalScrollIndicator = false
                                                            scrollView.showsHorizontalScrollIndicator = false
                                                            scrollView.addSubview(self.view)
                                                            self.view = scrollView
                                                            }

                                                            override func viewDidLayoutSubviews() {
                                                            scrollView.sizeToFit()
                                                            scrollView.contentSize = scrollView.frame.size
                                                            super.viewDidLayoutSubviews()
                                                            }

                                                            deinit {
                                                            self.deregisterFromKeyboardNotifications()
                                                            }

                                                            override func didReceiveMemoryWarning() {
                                                            super.didReceiveMemoryWarning()
                                                            // Dispose of any resources that can be recreated.
                                                            }


                                                            func registerForKeyboardNotifications()
                                                            {
                                                            //Adding notifies on keyboard appearing
                                                            NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(ScrollingFormViewController.keyboardWasShown), name: UIKeyboardWillShowNotification, object: nil)
                                                            NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(ScrollingFormViewController.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)
                                                            {
                                                            let info : NSDictionary = notification.userInfo!
                                                            keyboardRect = (info[UIKeyboardFrameEndUserInfoKey] as? NSValue)?.CGRectValue()
                                                            adjustForKeyboard()
                                                            }


                                                            func keyboardWillBeHidden(notification: NSNotification)
                                                            {
                                                            keyboardRect = nil
                                                            adjustForKeyboard()
                                                            }

                                                            func adjustForKeyboard() {
                                                            if keyboardRect != nil && activeFieldRect != nil {
                                                            let aRect : CGRect = scrollView.convertRect(activeFieldRect!, toView: nil)
                                                            if (CGRectContainsPoint(keyboardRect!, CGPointMake(aRect.origin.x, aRect.maxY)))
                                                            {
                                                            scrollView.scrollEnabled = true
                                                            let contentInsets : UIEdgeInsets = UIEdgeInsetsMake(0.0, 0.0, keyboardRect!.size.height, 0.0)
                                                            scrollView.contentInset = contentInsets
                                                            scrollView.scrollIndicatorInsets = contentInsets
                                                            scrollView.scrollRectToVisible(activeFieldRect!, animated: true)
                                                            }
                                                            } else {
                                                            let contentInsets : UIEdgeInsets = UIEdgeInsetsZero
                                                            scrollView.contentInset = contentInsets
                                                            scrollView.scrollIndicatorInsets = contentInsets
                                                            scrollView.scrollEnabled = false
                                                            }
                                                            }

                                                            func textViewDidBeginEditing(textView: UITextView) {
                                                            activeFieldRect = textView.frame
                                                            adjustForKeyboard()
                                                            }

                                                            func textViewDidEndEditing(textView: UITextView) {
                                                            activeFieldRect = nil
                                                            adjustForKeyboard()
                                                            }

                                                            func textFieldDidBeginEditing(textField: UITextField)
                                                            {
                                                            activeFieldRect = textField.frame
                                                            adjustForKeyboard()
                                                            }

                                                            func textFieldDidEndEditing(textField: UITextField)
                                                            {
                                                            activeFieldRect = nil
                                                            adjustForKeyboard()
                                                            }

                                                            }





                                                            share|improve this answer












                                                            Here's my version after reading the documentation provided by Apple and the previous posts. One thing I noticed is that the textView was not handled when covered by the keyboard. Unfortunately, Apple's documentation won't work because, for whatever reason, the keyboard is called AFTER the textViewDidBeginEditing is called. I handled this by calling a central method that checks if the keyboard is displayed AND if a textView or textField is being edited. This way, the process is only fired when BOTH conditions exists.



                                                            Another point with textViews is that their height may be such that the keyboard clips the bottom of the textView and would not adjust if the Top-Left point of the was in view. So, the code I wrote actually takes the screen-referenced Bottom-Left point of any textView or textField and sees if it falls in the screen-referenced coordinates of the presented keyboard implying that the keyboard covers some portion of it.



                                                            let aRect : CGRect = scrollView.convertRect(activeFieldRect!, toView: nil)
                                                            if (CGRectContainsPoint(keyboardRect!, CGPointMake(aRect.origin.x, aRect.maxY))) {
                                                            // scroll textView/textField into view
                                                            }


                                                            If you're using a navigation controller, the subclass also sets the scroll view automatic adjustment for insets to false.



                                                            self.automaticallyAdjustsScrollViewInsets = false


                                                            It walks through each textView and textField to set delegates for handling



                                                                for view in self.view.subviews {
                                                            if view is UITextView {
                                                            let tv = view as! UITextView
                                                            tv.delegate = self
                                                            } else if view is UITextField {
                                                            let tf = view as! UITextField
                                                            tf.delegate = self
                                                            }
                                                            }


                                                            Simply set your base class to the subclass created here for results.



                                                            import UIKit

                                                            class ScrollingFormViewController: UIViewController, UITextViewDelegate, UITextFieldDelegate {

                                                            var activeFieldRect: CGRect?
                                                            var keyboardRect: CGRect?
                                                            var scrollView: UIScrollView!

                                                            override func viewDidLoad() {

                                                            self.automaticallyAdjustsScrollViewInsets = false

                                                            super.viewDidLoad()

                                                            // Do any additional setup after loading the view.
                                                            self.registerForKeyboardNotifications()
                                                            for view in self.view.subviews {
                                                            if view is UITextView {
                                                            let tv = view as! UITextView
                                                            tv.delegate = self
                                                            } else if view is UITextField {
                                                            let tf = view as! UITextField
                                                            tf.delegate = self
                                                            }
                                                            }
                                                            scrollView = UIScrollView(frame: self.view.frame)
                                                            scrollView.scrollEnabled = false
                                                            scrollView.showsVerticalScrollIndicator = false
                                                            scrollView.showsHorizontalScrollIndicator = false
                                                            scrollView.addSubview(self.view)
                                                            self.view = scrollView
                                                            }

                                                            override func viewDidLayoutSubviews() {
                                                            scrollView.sizeToFit()
                                                            scrollView.contentSize = scrollView.frame.size
                                                            super.viewDidLayoutSubviews()
                                                            }

                                                            deinit {
                                                            self.deregisterFromKeyboardNotifications()
                                                            }

                                                            override func didReceiveMemoryWarning() {
                                                            super.didReceiveMemoryWarning()
                                                            // Dispose of any resources that can be recreated.
                                                            }


                                                            func registerForKeyboardNotifications()
                                                            {
                                                            //Adding notifies on keyboard appearing
                                                            NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(ScrollingFormViewController.keyboardWasShown), name: UIKeyboardWillShowNotification, object: nil)
                                                            NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(ScrollingFormViewController.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)
                                                            {
                                                            let info : NSDictionary = notification.userInfo!
                                                            keyboardRect = (info[UIKeyboardFrameEndUserInfoKey] as? NSValue)?.CGRectValue()
                                                            adjustForKeyboard()
                                                            }


                                                            func keyboardWillBeHidden(notification: NSNotification)
                                                            {
                                                            keyboardRect = nil
                                                            adjustForKeyboard()
                                                            }

                                                            func adjustForKeyboard() {
                                                            if keyboardRect != nil && activeFieldRect != nil {
                                                            let aRect : CGRect = scrollView.convertRect(activeFieldRect!, toView: nil)
                                                            if (CGRectContainsPoint(keyboardRect!, CGPointMake(aRect.origin.x, aRect.maxY)))
                                                            {
                                                            scrollView.scrollEnabled = true
                                                            let contentInsets : UIEdgeInsets = UIEdgeInsetsMake(0.0, 0.0, keyboardRect!.size.height, 0.0)
                                                            scrollView.contentInset = contentInsets
                                                            scrollView.scrollIndicatorInsets = contentInsets
                                                            scrollView.scrollRectToVisible(activeFieldRect!, animated: true)
                                                            }
                                                            } else {
                                                            let contentInsets : UIEdgeInsets = UIEdgeInsetsZero
                                                            scrollView.contentInset = contentInsets
                                                            scrollView.scrollIndicatorInsets = contentInsets
                                                            scrollView.scrollEnabled = false
                                                            }
                                                            }

                                                            func textViewDidBeginEditing(textView: UITextView) {
                                                            activeFieldRect = textView.frame
                                                            adjustForKeyboard()
                                                            }

                                                            func textViewDidEndEditing(textView: UITextView) {
                                                            activeFieldRect = nil
                                                            adjustForKeyboard()
                                                            }

                                                            func textFieldDidBeginEditing(textField: UITextField)
                                                            {
                                                            activeFieldRect = textField.frame
                                                            adjustForKeyboard()
                                                            }

                                                            func textFieldDidEndEditing(textField: UITextField)
                                                            {
                                                            activeFieldRect = nil
                                                            adjustForKeyboard()
                                                            }

                                                            }






                                                            share|improve this answer












                                                            share|improve this answer



                                                            share|improve this answer










                                                            answered Apr 26 '16 at 16:24









                                                            user2690492user2690492

                                                            111




                                                            111























                                                                1














                                                                In the example below, I am only moving the view up when I start editing the txtLastName or txtCity. I created the variable keyboardActive because the view can move up 2x if I click in txtLastName and after that txtCity.



                                                                Take a look and see if it works for you.



                                                                class ViewController: UIViewController, UITextFieldDelegate {

                                                                @IBOutlet weak var txtFirstName: UITextField!
                                                                @IBOutlet weak var txtLastName: UITextField!
                                                                @IBOutlet weak var txtCity: UITextField!

                                                                var keyboardActive = false

                                                                override func viewDidLoad() {
                                                                super.viewDidLoad()
                                                                self.txtFirstName.delegate = self
                                                                self.txtLastName.delegate = self
                                                                self.txtCity.delegate = self
                                                                }

                                                                func textFieldDidBeginEditing(textField: UITextField) {
                                                                if textField != self.txtFirstName && keyboardActive == false {
                                                                self.view.frame.origin.y -= 165
                                                                self.keyboardActive = true
                                                                }
                                                                }

                                                                func textFieldShouldEndEditing(textField: UITextField) -> Bool {
                                                                if textField != self.txtFirstName && keyboardActive == true {
                                                                self.view.frame.origin.y += 165
                                                                self.keyboardActive = false
                                                                }
                                                                return true
                                                                }

                                                                func textFieldShouldReturn(textField: UITextField) -> Bool {
                                                                self.view.endEditing(true)
                                                                return false
                                                                }

                                                                }





                                                                share|improve this answer




























                                                                  1














                                                                  In the example below, I am only moving the view up when I start editing the txtLastName or txtCity. I created the variable keyboardActive because the view can move up 2x if I click in txtLastName and after that txtCity.



                                                                  Take a look and see if it works for you.



                                                                  class ViewController: UIViewController, UITextFieldDelegate {

                                                                  @IBOutlet weak var txtFirstName: UITextField!
                                                                  @IBOutlet weak var txtLastName: UITextField!
                                                                  @IBOutlet weak var txtCity: UITextField!

                                                                  var keyboardActive = false

                                                                  override func viewDidLoad() {
                                                                  super.viewDidLoad()
                                                                  self.txtFirstName.delegate = self
                                                                  self.txtLastName.delegate = self
                                                                  self.txtCity.delegate = self
                                                                  }

                                                                  func textFieldDidBeginEditing(textField: UITextField) {
                                                                  if textField != self.txtFirstName && keyboardActive == false {
                                                                  self.view.frame.origin.y -= 165
                                                                  self.keyboardActive = true
                                                                  }
                                                                  }

                                                                  func textFieldShouldEndEditing(textField: UITextField) -> Bool {
                                                                  if textField != self.txtFirstName && keyboardActive == true {
                                                                  self.view.frame.origin.y += 165
                                                                  self.keyboardActive = false
                                                                  }
                                                                  return true
                                                                  }

                                                                  func textFieldShouldReturn(textField: UITextField) -> Bool {
                                                                  self.view.endEditing(true)
                                                                  return false
                                                                  }

                                                                  }





                                                                  share|improve this answer


























                                                                    1












                                                                    1








                                                                    1






                                                                    In the example below, I am only moving the view up when I start editing the txtLastName or txtCity. I created the variable keyboardActive because the view can move up 2x if I click in txtLastName and after that txtCity.



                                                                    Take a look and see if it works for you.



                                                                    class ViewController: UIViewController, UITextFieldDelegate {

                                                                    @IBOutlet weak var txtFirstName: UITextField!
                                                                    @IBOutlet weak var txtLastName: UITextField!
                                                                    @IBOutlet weak var txtCity: UITextField!

                                                                    var keyboardActive = false

                                                                    override func viewDidLoad() {
                                                                    super.viewDidLoad()
                                                                    self.txtFirstName.delegate = self
                                                                    self.txtLastName.delegate = self
                                                                    self.txtCity.delegate = self
                                                                    }

                                                                    func textFieldDidBeginEditing(textField: UITextField) {
                                                                    if textField != self.txtFirstName && keyboardActive == false {
                                                                    self.view.frame.origin.y -= 165
                                                                    self.keyboardActive = true
                                                                    }
                                                                    }

                                                                    func textFieldShouldEndEditing(textField: UITextField) -> Bool {
                                                                    if textField != self.txtFirstName && keyboardActive == true {
                                                                    self.view.frame.origin.y += 165
                                                                    self.keyboardActive = false
                                                                    }
                                                                    return true
                                                                    }

                                                                    func textFieldShouldReturn(textField: UITextField) -> Bool {
                                                                    self.view.endEditing(true)
                                                                    return false
                                                                    }

                                                                    }





                                                                    share|improve this answer














                                                                    In the example below, I am only moving the view up when I start editing the txtLastName or txtCity. I created the variable keyboardActive because the view can move up 2x if I click in txtLastName and after that txtCity.



                                                                    Take a look and see if it works for you.



                                                                    class ViewController: UIViewController, UITextFieldDelegate {

                                                                    @IBOutlet weak var txtFirstName: UITextField!
                                                                    @IBOutlet weak var txtLastName: UITextField!
                                                                    @IBOutlet weak var txtCity: UITextField!

                                                                    var keyboardActive = false

                                                                    override func viewDidLoad() {
                                                                    super.viewDidLoad()
                                                                    self.txtFirstName.delegate = self
                                                                    self.txtLastName.delegate = self
                                                                    self.txtCity.delegate = self
                                                                    }

                                                                    func textFieldDidBeginEditing(textField: UITextField) {
                                                                    if textField != self.txtFirstName && keyboardActive == false {
                                                                    self.view.frame.origin.y -= 165
                                                                    self.keyboardActive = true
                                                                    }
                                                                    }

                                                                    func textFieldShouldEndEditing(textField: UITextField) -> Bool {
                                                                    if textField != self.txtFirstName && keyboardActive == true {
                                                                    self.view.frame.origin.y += 165
                                                                    self.keyboardActive = false
                                                                    }
                                                                    return true
                                                                    }

                                                                    func textFieldShouldReturn(textField: UITextField) -> Bool {
                                                                    self.view.endEditing(true)
                                                                    return false
                                                                    }

                                                                    }






                                                                    share|improve this answer














                                                                    share|improve this answer



                                                                    share|improve this answer








                                                                    edited Jul 14 '16 at 22:08

























                                                                    answered Jul 14 '16 at 22:02









                                                                    Vitor OliveiraVitor Oliveira

                                                                    10918




                                                                    10918























                                                                        1














                                                                        Awesome answers are already given but this is a different way to deal with this situation (using Swift 3x):



                                                                        First of all call the following method in viewWillAppear()



                                                                        func registerForKeyboardNotifications() {

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

                                                                        }


                                                                        Now take one IBOutlet of UIView's top constraints of your UIViewcontroller like this: (here the UIView is the subview of UIScrollView that means you should have a UIScrollView for all your subViews)



                                                                        @IBOutlet weak var loginViewTopConstraint: NSLayoutConstraint!


                                                                        And an another variable like following and add a delegate i.e. UITextFieldDelegate:



                                                                        var activeTextField = UITextField() //This is to keep the reference of UITextField currently active


                                                                        After that here is the magical part just paste this below snippet:



                                                                        func keyboardWasShown(_ notification: Notification) {

                                                                        let keyboardInfo = notification.userInfo as NSDictionary?

                                                                        //print(keyboardInfo!)

                                                                        let keyboardFrameEnd: NSValue? = (keyboardInfo?.value(forKey: UIKeyboardFrameEndUserInfoKey) as? NSValue)

                                                                        let keyboardFrameEndRect: CGRect? = keyboardFrameEnd?.cgRectValue


                                                                        if activeTextField.frame.origin.y + activeTextField.frame.size.height + 10 > (keyboardFrameEndRect?.origin.y)! {

                                                                        UIView.animate(withDuration: 0.3, delay: 0, options: .transitionFlipFromTop, animations: {() -> Void in

                                                                        //code with animation

                                                                        //Print some stuff to know what is actually happening
                                                                        //print(self.activeTextField.frame.origin.y)
                                                                        //print(self.activeTextField.frame.size.height)
                                                                        //print(self.activeTextField.frame.size.height)

                                                                        self.loginViewTopConstraint.constant = -(self.activeTextField.frame.origin.y + self.activeTextField.frame.size.height - (keyboardFrameEndRect?.origin.y)!) - 30.0

                                                                        self.view.layoutIfNeeded()

                                                                        }, completion: {(_ finished: Bool) -> Void in
                                                                        //code for completion

                                                                        })
                                                                        }
                                                                        }

                                                                        func keyboardWillBeHidden(_ notification: Notification) {

                                                                        UIView.animate(withDuration: 0.3, animations: {() -> Void in

                                                                        self.loginViewTopConstraint.constant = self.view.frame.origin.y
                                                                        self.view.layoutIfNeeded()

                                                                        })
                                                                        }

                                                                        //MARK: textfield delegates
                                                                        func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool {
                                                                        activeTextField = textField
                                                                        return true
                                                                        }

                                                                        func textFieldShouldReturn(_ textField: UITextField) -> Bool {

                                                                        switch textField {
                                                                        case YOUR_TEXTFIELD_ONE:
                                                                        YOUR_TEXTFIELD_TWO.becomeFirstResponder()
                                                                        break
                                                                        case YOUR_TEXTFIELD_TWO:
                                                                        YOUR_TEXTFIELD_THREE.becomeFirstResponder()
                                                                        break
                                                                        default:
                                                                        textField.resignFirstResponder()
                                                                        break
                                                                        }
                                                                        return true
                                                                        }


                                                                        Now the last snippet:



                                                                        //Remove Keyboard Observers
                                                                        override func viewWillDisappear(_ animated: Bool) {

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

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


                                                                        Don't forget to assign delegates to all your UITextFields in UIStoryboard



                                                                        Good luck!






                                                                        share|improve this answer




























                                                                          1














                                                                          Awesome answers are already given but this is a different way to deal with this situation (using Swift 3x):



                                                                          First of all call the following method in viewWillAppear()



                                                                          func registerForKeyboardNotifications() {

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

                                                                          }


                                                                          Now take one IBOutlet of UIView's top constraints of your UIViewcontroller like this: (here the UIView is the subview of UIScrollView that means you should have a UIScrollView for all your subViews)



                                                                          @IBOutlet weak var loginViewTopConstraint: NSLayoutConstraint!


                                                                          And an another variable like following and add a delegate i.e. UITextFieldDelegate:



                                                                          var activeTextField = UITextField() //This is to keep the reference of UITextField currently active


                                                                          After that here is the magical part just paste this below snippet:



                                                                          func keyboardWasShown(_ notification: Notification) {

                                                                          let keyboardInfo = notification.userInfo as NSDictionary?

                                                                          //print(keyboardInfo!)

                                                                          let keyboardFrameEnd: NSValue? = (keyboardInfo?.value(forKey: UIKeyboardFrameEndUserInfoKey) as? NSValue)

                                                                          let keyboardFrameEndRect: CGRect? = keyboardFrameEnd?.cgRectValue


                                                                          if activeTextField.frame.origin.y + activeTextField.frame.size.height + 10 > (keyboardFrameEndRect?.origin.y)! {

                                                                          UIView.animate(withDuration: 0.3, delay: 0, options: .transitionFlipFromTop, animations: {() -> Void in

                                                                          //code with animation

                                                                          //Print some stuff to know what is actually happening
                                                                          //print(self.activeTextField.frame.origin.y)
                                                                          //print(self.activeTextField.frame.size.height)
                                                                          //print(self.activeTextField.frame.size.height)

                                                                          self.loginViewTopConstraint.constant = -(self.activeTextField.frame.origin.y + self.activeTextField.frame.size.height - (keyboardFrameEndRect?.origin.y)!) - 30.0

                                                                          self.view.layoutIfNeeded()

                                                                          }, completion: {(_ finished: Bool) -> Void in
                                                                          //code for completion

                                                                          })
                                                                          }
                                                                          }

                                                                          func keyboardWillBeHidden(_ notification: Notification) {

                                                                          UIView.animate(withDuration: 0.3, animations: {() -> Void in

                                                                          self.loginViewTopConstraint.constant = self.view.frame.origin.y
                                                                          self.view.layoutIfNeeded()

                                                                          })
                                                                          }

                                                                          //MARK: textfield delegates
                                                                          func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool {
                                                                          activeTextField = textField
                                                                          return true
                                                                          }

                                                                          func textFieldShouldReturn(_ textField: UITextField) -> Bool {

                                                                          switch textField {
                                                                          case YOUR_TEXTFIELD_ONE:
                                                                          YOUR_TEXTFIELD_TWO.becomeFirstResponder()
                                                                          break
                                                                          case YOUR_TEXTFIELD_TWO:
                                                                          YOUR_TEXTFIELD_THREE.becomeFirstResponder()
                                                                          break
                                                                          default:
                                                                          textField.resignFirstResponder()
                                                                          break
                                                                          }
                                                                          return true
                                                                          }


                                                                          Now the last snippet:



                                                                          //Remove Keyboard Observers
                                                                          override func viewWillDisappear(_ animated: Bool) {

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

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


                                                                          Don't forget to assign delegates to all your UITextFields in UIStoryboard



                                                                          Good luck!






                                                                          share|improve this answer


























                                                                            1












                                                                            1








                                                                            1






                                                                            Awesome answers are already given but this is a different way to deal with this situation (using Swift 3x):



                                                                            First of all call the following method in viewWillAppear()



                                                                            func registerForKeyboardNotifications() {

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

                                                                            }


                                                                            Now take one IBOutlet of UIView's top constraints of your UIViewcontroller like this: (here the UIView is the subview of UIScrollView that means you should have a UIScrollView for all your subViews)



                                                                            @IBOutlet weak var loginViewTopConstraint: NSLayoutConstraint!


                                                                            And an another variable like following and add a delegate i.e. UITextFieldDelegate:



                                                                            var activeTextField = UITextField() //This is to keep the reference of UITextField currently active


                                                                            After that here is the magical part just paste this below snippet:



                                                                            func keyboardWasShown(_ notification: Notification) {

                                                                            let keyboardInfo = notification.userInfo as NSDictionary?

                                                                            //print(keyboardInfo!)

                                                                            let keyboardFrameEnd: NSValue? = (keyboardInfo?.value(forKey: UIKeyboardFrameEndUserInfoKey) as? NSValue)

                                                                            let keyboardFrameEndRect: CGRect? = keyboardFrameEnd?.cgRectValue


                                                                            if activeTextField.frame.origin.y + activeTextField.frame.size.height + 10 > (keyboardFrameEndRect?.origin.y)! {

                                                                            UIView.animate(withDuration: 0.3, delay: 0, options: .transitionFlipFromTop, animations: {() -> Void in

                                                                            //code with animation

                                                                            //Print some stuff to know what is actually happening
                                                                            //print(self.activeTextField.frame.origin.y)
                                                                            //print(self.activeTextField.frame.size.height)
                                                                            //print(self.activeTextField.frame.size.height)

                                                                            self.loginViewTopConstraint.constant = -(self.activeTextField.frame.origin.y + self.activeTextField.frame.size.height - (keyboardFrameEndRect?.origin.y)!) - 30.0

                                                                            self.view.layoutIfNeeded()

                                                                            }, completion: {(_ finished: Bool) -> Void in
                                                                            //code for completion

                                                                            })
                                                                            }
                                                                            }

                                                                            func keyboardWillBeHidden(_ notification: Notification) {

                                                                            UIView.animate(withDuration: 0.3, animations: {() -> Void in

                                                                            self.loginViewTopConstraint.constant = self.view.frame.origin.y
                                                                            self.view.layoutIfNeeded()

                                                                            })
                                                                            }

                                                                            //MARK: textfield delegates
                                                                            func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool {
                                                                            activeTextField = textField
                                                                            return true
                                                                            }

                                                                            func textFieldShouldReturn(_ textField: UITextField) -> Bool {

                                                                            switch textField {
                                                                            case YOUR_TEXTFIELD_ONE:
                                                                            YOUR_TEXTFIELD_TWO.becomeFirstResponder()
                                                                            break
                                                                            case YOUR_TEXTFIELD_TWO:
                                                                            YOUR_TEXTFIELD_THREE.becomeFirstResponder()
                                                                            break
                                                                            default:
                                                                            textField.resignFirstResponder()
                                                                            break
                                                                            }
                                                                            return true
                                                                            }


                                                                            Now the last snippet:



                                                                            //Remove Keyboard Observers
                                                                            override func viewWillDisappear(_ animated: Bool) {

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

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


                                                                            Don't forget to assign delegates to all your UITextFields in UIStoryboard



                                                                            Good luck!






                                                                            share|improve this answer














                                                                            Awesome answers are already given but this is a different way to deal with this situation (using Swift 3x):



                                                                            First of all call the following method in viewWillAppear()



                                                                            func registerForKeyboardNotifications() {

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

                                                                            }


                                                                            Now take one IBOutlet of UIView's top constraints of your UIViewcontroller like this: (here the UIView is the subview of UIScrollView that means you should have a UIScrollView for all your subViews)



                                                                            @IBOutlet weak var loginViewTopConstraint: NSLayoutConstraint!


                                                                            And an another variable like following and add a delegate i.e. UITextFieldDelegate:



                                                                            var activeTextField = UITextField() //This is to keep the reference of UITextField currently active


                                                                            After that here is the magical part just paste this below snippet:



                                                                            func keyboardWasShown(_ notification: Notification) {

                                                                            let keyboardInfo = notification.userInfo as NSDictionary?

                                                                            //print(keyboardInfo!)

                                                                            let keyboardFrameEnd: NSValue? = (keyboardInfo?.value(forKey: UIKeyboardFrameEndUserInfoKey) as? NSValue)

                                                                            let keyboardFrameEndRect: CGRect? = keyboardFrameEnd?.cgRectValue


                                                                            if activeTextField.frame.origin.y + activeTextField.frame.size.height + 10 > (keyboardFrameEndRect?.origin.y)! {

                                                                            UIView.animate(withDuration: 0.3, delay: 0, options: .transitionFlipFromTop, animations: {() -> Void in

                                                                            //code with animation

                                                                            //Print some stuff to know what is actually happening
                                                                            //print(self.activeTextField.frame.origin.y)
                                                                            //print(self.activeTextField.frame.size.height)
                                                                            //print(self.activeTextField.frame.size.height)

                                                                            self.loginViewTopConstraint.constant = -(self.activeTextField.frame.origin.y + self.activeTextField.frame.size.height - (keyboardFrameEndRect?.origin.y)!) - 30.0

                                                                            self.view.layoutIfNeeded()

                                                                            }, completion: {(_ finished: Bool) -> Void in
                                                                            //code for completion

                                                                            })
                                                                            }
                                                                            }

                                                                            func keyboardWillBeHidden(_ notification: Notification) {

                                                                            UIView.animate(withDuration: 0.3, animations: {() -> Void in

                                                                            self.loginViewTopConstraint.constant = self.view.frame.origin.y
                                                                            self.view.layoutIfNeeded()

                                                                            })
                                                                            }

                                                                            //MARK: textfield delegates
                                                                            func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool {
                                                                            activeTextField = textField
                                                                            return true
                                                                            }

                                                                            func textFieldShouldReturn(_ textField: UITextField) -> Bool {

                                                                            switch textField {
                                                                            case YOUR_TEXTFIELD_ONE:
                                                                            YOUR_TEXTFIELD_TWO.becomeFirstResponder()
                                                                            break
                                                                            case YOUR_TEXTFIELD_TWO:
                                                                            YOUR_TEXTFIELD_THREE.becomeFirstResponder()
                                                                            break
                                                                            default:
                                                                            textField.resignFirstResponder()
                                                                            break
                                                                            }
                                                                            return true
                                                                            }


                                                                            Now the last snippet:



                                                                            //Remove Keyboard Observers
                                                                            override func viewWillDisappear(_ animated: Bool) {

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

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


                                                                            Don't forget to assign delegates to all your UITextFields in UIStoryboard



                                                                            Good luck!







                                                                            share|improve this answer














                                                                            share|improve this answer



                                                                            share|improve this answer








                                                                            edited Apr 7 '17 at 4:53

























                                                                            answered Mar 29 '17 at 7:19









                                                                            Anurag SharmaAnurag Sharma

                                                                            1,4411229




                                                                            1,4411229























                                                                                1














                                                                                Swift 3 syntax:



                                                                                func textFieldDidBeginEditing(_ textField: UITextField) {
                                                                                // add if for some desired textfields
                                                                                animateViewMoving(up: true, moveValue: 100)
                                                                                }

                                                                                func textFieldDidEndEditing(_ textField: UITextField) {
                                                                                // add if for some desired textfields
                                                                                animateViewMoving(up: false, moveValue: 100)
                                                                                }

                                                                                func animateViewMoving (up:Bool, moveValue :CGFloat){
                                                                                textFieldDidEndEditing(_ textField: UITextField) {

                                                                                let movementDuration:TimeInterval = 0.5

                                                                                let movement:CGFloat = ( up ? -moveValue : moveValue)

                                                                                UIView.beginAnimations("animateView", context: nil)

                                                                                UIView.setAnimationBeginsFromCurrentState(true)

                                                                                UIView.setAnimationDuration(movementDuration)

                                                                                self.view.frame = self.view.frame.offsetBy(dx: 0, dy: movement)

                                                                                UIView.commitAnimations()
                                                                                }


                                                                                this is a nice method to get what you want
                                                                                you can add "if" conditions for certain textfields
                                                                                but this type works for all... Hope it can be useful for everyone






                                                                                share|improve this answer


























                                                                                  1














                                                                                  Swift 3 syntax:



                                                                                  func textFieldDidBeginEditing(_ textField: UITextField) {
                                                                                  // add if for some desired textfields
                                                                                  animateViewMoving(up: true, moveValue: 100)
                                                                                  }

                                                                                  func textFieldDidEndEditing(_ textField: UITextField) {
                                                                                  // add if for some desired textfields
                                                                                  animateViewMoving(up: false, moveValue: 100)
                                                                                  }

                                                                                  func animateViewMoving (up:Bool, moveValue :CGFloat){
                                                                                  textFieldDidEndEditing(_ textField: UITextField) {

                                                                                  let movementDuration:TimeInterval = 0.5

                                                                                  let movement:CGFloat = ( up ? -moveValue : moveValue)

                                                                                  UIView.beginAnimations("animateView", context: nil)

                                                                                  UIView.setAnimationBeginsFromCurrentState(true)

                                                                                  UIView.setAnimationDuration(movementDuration)

                                                                                  self.view.frame = self.view.frame.offsetBy(dx: 0, dy: movement)

                                                                                  UIView.commitAnimations()
                                                                                  }


                                                                                  this is a nice method to get what you want
                                                                                  you can add "if" conditions for certain textfields
                                                                                  but this type works for all... Hope it can be useful for everyone






                                                                                  share|improve this answer
























                                                                                    1












                                                                                    1








                                                                                    1






                                                                                    Swift 3 syntax:



                                                                                    func textFieldDidBeginEditing(_ textField: UITextField) {
                                                                                    // add if for some desired textfields
                                                                                    animateViewMoving(up: true, moveValue: 100)
                                                                                    }

                                                                                    func textFieldDidEndEditing(_ textField: UITextField) {
                                                                                    // add if for some desired textfields
                                                                                    animateViewMoving(up: false, moveValue: 100)
                                                                                    }

                                                                                    func animateViewMoving (up:Bool, moveValue :CGFloat){
                                                                                    textFieldDidEndEditing(_ textField: UITextField) {

                                                                                    let movementDuration:TimeInterval = 0.5

                                                                                    let movement:CGFloat = ( up ? -moveValue : moveValue)

                                                                                    UIView.beginAnimations("animateView", context: nil)

                                                                                    UIView.setAnimationBeginsFromCurrentState(true)

                                                                                    UIView.setAnimationDuration(movementDuration)

                                                                                    self.view.frame = self.view.frame.offsetBy(dx: 0, dy: movement)

                                                                                    UIView.commitAnimations()
                                                                                    }


                                                                                    this is a nice method to get what you want
                                                                                    you can add "if" conditions for certain textfields
                                                                                    but this type works for all... Hope it can be useful for everyone






                                                                                    share|improve this answer












                                                                                    Swift 3 syntax:



                                                                                    func textFieldDidBeginEditing(_ textField: UITextField) {
                                                                                    // add if for some desired textfields
                                                                                    animateViewMoving(up: true, moveValue: 100)
                                                                                    }

                                                                                    func textFieldDidEndEditing(_ textField: UITextField) {
                                                                                    // add if for some desired textfields
                                                                                    animateViewMoving(up: false, moveValue: 100)
                                                                                    }

                                                                                    func animateViewMoving (up:Bool, moveValue :CGFloat){
                                                                                    textFieldDidEndEditing(_ textField: UITextField) {

                                                                                    let movementDuration:TimeInterval = 0.5

                                                                                    let movement:CGFloat = ( up ? -moveValue : moveValue)

                                                                                    UIView.beginAnimations("animateView", context: nil)

                                                                                    UIView.setAnimationBeginsFromCurrentState(true)

                                                                                    UIView.setAnimationDuration(movementDuration)

                                                                                    self.view.frame = self.view.frame.offsetBy(dx: 0, dy: movement)

                                                                                    UIView.commitAnimations()
                                                                                    }


                                                                                    this is a nice method to get what you want
                                                                                    you can add "if" conditions for certain textfields
                                                                                    but this type works for all... Hope it can be useful for everyone







                                                                                    share|improve this answer












                                                                                    share|improve this answer



                                                                                    share|improve this answer










                                                                                    answered Aug 22 '17 at 14:20









                                                                                    AtrinAtrin

                                                                                    133




                                                                                    133























                                                                                        0














                                                                                        "I forgot to mention that I am new to Swift :( What would be the correct syntax to check this? (how do I get the field name in this function?) "



                                                                                        Ok . First confirm to the UITextFieldDelegate protocol



                                                                                        class YourClass:UITextFieldDelegate


                                                                                        Then implement the function



                                                                                        func textFieldDidBeginEditing(textField: UITextField!) {

                                                                                        if textField == txtOne
                                                                                        {
                                                                                        println("TextOne")
                                                                                        }
                                                                                        if textField == txtTwo
                                                                                        {
                                                                                        println("TextTwo")
                                                                                        }
                                                                                        }


                                                                                        You should note that the proper approach is to use a scrollview and place the view that should be shifted up/down inside the scroll view and handle keyboard events accordingly






                                                                                        share|improve this answer























                                                                                        • Thanks guys for all your help!!!!
                                                                                          – John Allijn
                                                                                          Mar 3 '15 at 10:06
















                                                                                        0














                                                                                        "I forgot to mention that I am new to Swift :( What would be the correct syntax to check this? (how do I get the field name in this function?) "



                                                                                        Ok . First confirm to the UITextFieldDelegate protocol



                                                                                        class YourClass:UITextFieldDelegate


                                                                                        Then implement the function



                                                                                        func textFieldDidBeginEditing(textField: UITextField!) {

                                                                                        if textField == txtOne
                                                                                        {
                                                                                        println("TextOne")
                                                                                        }
                                                                                        if textField == txtTwo
                                                                                        {
                                                                                        println("TextTwo")
                                                                                        }
                                                                                        }


                                                                                        You should note that the proper approach is to use a scrollview and place the view that should be shifted up/down inside the scroll view and handle keyboard events accordingly






                                                                                        share|improve this answer























                                                                                        • Thanks guys for all your help!!!!
                                                                                          – John Allijn
                                                                                          Mar 3 '15 at 10:06














                                                                                        0












                                                                                        0








                                                                                        0






                                                                                        "I forgot to mention that I am new to Swift :( What would be the correct syntax to check this? (how do I get the field name in this function?) "



                                                                                        Ok . First confirm to the UITextFieldDelegate protocol



                                                                                        class YourClass:UITextFieldDelegate


                                                                                        Then implement the function



                                                                                        func textFieldDidBeginEditing(textField: UITextField!) {

                                                                                        if textField == txtOne
                                                                                        {
                                                                                        println("TextOne")
                                                                                        }
                                                                                        if textField == txtTwo
                                                                                        {
                                                                                        println("TextTwo")
                                                                                        }
                                                                                        }


                                                                                        You should note that the proper approach is to use a scrollview and place the view that should be shifted up/down inside the scroll view and handle keyboard events accordingly






                                                                                        share|improve this answer














                                                                                        "I forgot to mention that I am new to Swift :( What would be the correct syntax to check this? (how do I get the field name in this function?) "



                                                                                        Ok . First confirm to the UITextFieldDelegate protocol



                                                                                        class YourClass:UITextFieldDelegate


                                                                                        Then implement the function



                                                                                        func textFieldDidBeginEditing(textField: UITextField!) {

                                                                                        if textField == txtOne
                                                                                        {
                                                                                        println("TextOne")
                                                                                        }
                                                                                        if textField == txtTwo
                                                                                        {
                                                                                        println("TextTwo")
                                                                                        }
                                                                                        }


                                                                                        You should note that the proper approach is to use a scrollview and place the view that should be shifted up/down inside the scroll view and handle keyboard events accordingly







                                                                                        share|improve this answer














                                                                                        share|improve this answer



                                                                                        share|improve this answer








                                                                                        edited Mar 3 '15 at 10:50

























                                                                                        answered Mar 3 '15 at 8:23









                                                                                        humblePilgrimhumblePilgrim

                                                                                        87431741




                                                                                        87431741












                                                                                        • Thanks guys for all your help!!!!
                                                                                          – John Allijn
                                                                                          Mar 3 '15 at 10:06


















                                                                                        • Thanks guys for all your help!!!!
                                                                                          – John Allijn
                                                                                          Mar 3 '15 at 10:06
















                                                                                        Thanks guys for all your help!!!!
                                                                                        – John Allijn
                                                                                        Mar 3 '15 at 10:06




                                                                                        Thanks guys for all your help!!!!
                                                                                        – John Allijn
                                                                                        Mar 3 '15 at 10:06











                                                                                        0














                                                                                        This code moves up the text field you are editing so that you can view it in Swift 3 for this answer you also have to make your view a UITextFieldDelegate:



                                                                                        var moveValue: CGFloat!
                                                                                        var moved: Bool = false
                                                                                        var activeTextField = UITextField()

                                                                                        func textFieldDidBeginEditing(_ textField: UITextField) {
                                                                                        self.activeTextField = textField
                                                                                        }
                                                                                        func textFieldDidEndEditing(_ textField: UITextField) {
                                                                                        if moved == true{
                                                                                        self.animateViewMoving(up: false, moveValue: moveValue )
                                                                                        moved = false
                                                                                        }
                                                                                        }
                                                                                        func animateViewMoving (up:Bool, moveValue :CGFloat){
                                                                                        let movementDuration:TimeInterval = 0.3
                                                                                        let movement:CGFloat = ( up ? -moveValue : moveValue)

                                                                                        UIView.beginAnimations("animateView", context: nil)
                                                                                        UIView.setAnimationBeginsFromCurrentState(true)
                                                                                        UIView.setAnimationDuration(movementDuration)

                                                                                        self.view.frame = self.view.frame.offsetBy(dx: 0, dy: movement)
                                                                                        UIView.commitAnimations()
                                                                                        }


                                                                                        And then in viewDidLoad:



                                                                                        NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillShow), name: .UIKeyboardWillShow, object: nil)


                                                                                        Which calls (outside viewDidLoad):



                                                                                        func keyboardWillShow(notification: Notification) {
                                                                                        if let keyboardSize = (notification.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue {
                                                                                        let keyboardHeight = keyboardSize.height
                                                                                        if (view.frame.size.height-self.activeTextField.frame.origin.y) - self.activeTextField.frame.size.height < keyboardHeight{
                                                                                        moveValue = keyboardHeight - ((view.frame.size.height-self.activeTextField.frame.origin.y) - self.activeTextField.frame.size.height)
                                                                                        self.animateViewMoving(up: true, moveValue: moveValue )
                                                                                        moved = true
                                                                                        }
                                                                                        }
                                                                                        }





                                                                                        share|improve this answer




























                                                                                          0














                                                                                          This code moves up the text field you are editing so that you can view it in Swift 3 for this answer you also have to make your view a UITextFieldDelegate:



                                                                                          var moveValue: CGFloat!
                                                                                          var moved: Bool = false
                                                                                          var activeTextField = UITextField()

                                                                                          func textFieldDidBeginEditing(_ textField: UITextField) {
                                                                                          self.activeTextField = textField
                                                                                          }
                                                                                          func textFieldDidEndEditing(_ textField: UITextField) {
                                                                                          if moved == true{
                                                                                          self.animateViewMoving(up: false, moveValue: moveValue )
                                                                                          moved = false
                                                                                          }
                                                                                          }
                                                                                          func animateViewMoving (up:Bool, moveValue :CGFloat){
                                                                                          let movementDuration:TimeInterval = 0.3
                                                                                          let movement:CGFloat = ( up ? -moveValue : moveValue)

                                                                                          UIView.beginAnimations("animateView", context: nil)
                                                                                          UIView.setAnimationBeginsFromCurrentState(true)
                                                                                          UIView.setAnimationDuration(movementDuration)

                                                                                          self.view.frame = self.view.frame.offsetBy(dx: 0, dy: movement)
                                                                                          UIView.commitAnimations()
                                                                                          }


                                                                                          And then in viewDidLoad:



                                                                                          NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillShow), name: .UIKeyboardWillShow, object: nil)


                                                                                          Which calls (outside viewDidLoad):



                                                                                          func keyboardWillShow(notification: Notification) {
                                                                                          if let keyboardSize = (notification.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue {
                                                                                          let keyboardHeight = keyboardSize.height
                                                                                          if (view.frame.size.height-self.activeTextField.frame.origin.y) - self.activeTextField.frame.size.height < keyboardHeight{
                                                                                          moveValue = keyboardHeight - ((view.frame.size.height-self.activeTextField.frame.origin.y) - self.activeTextField.frame.size.height)
                                                                                          self.animateViewMoving(up: true, moveValue: moveValue )
                                                                                          moved = true
                                                                                          }
                                                                                          }
                                                                                          }





                                                                                          share|improve this answer


























                                                                                            0












                                                                                            0








                                                                                            0






                                                                                            This code moves up the text field you are editing so that you can view it in Swift 3 for this answer you also have to make your view a UITextFieldDelegate:



                                                                                            var moveValue: CGFloat!
                                                                                            var moved: Bool = false
                                                                                            var activeTextField = UITextField()

                                                                                            func textFieldDidBeginEditing(_ textField: UITextField) {
                                                                                            self.activeTextField = textField
                                                                                            }
                                                                                            func textFieldDidEndEditing(_ textField: UITextField) {
                                                                                            if moved == true{
                                                                                            self.animateViewMoving(up: false, moveValue: moveValue )
                                                                                            moved = false
                                                                                            }
                                                                                            }
                                                                                            func animateViewMoving (up:Bool, moveValue :CGFloat){
                                                                                            let movementDuration:TimeInterval = 0.3
                                                                                            let movement:CGFloat = ( up ? -moveValue : moveValue)

                                                                                            UIView.beginAnimations("animateView", context: nil)
                                                                                            UIView.setAnimationBeginsFromCurrentState(true)
                                                                                            UIView.setAnimationDuration(movementDuration)

                                                                                            self.view.frame = self.view.frame.offsetBy(dx: 0, dy: movement)
                                                                                            UIView.commitAnimations()
                                                                                            }


                                                                                            And then in viewDidLoad:



                                                                                            NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillShow), name: .UIKeyboardWillShow, object: nil)


                                                                                            Which calls (outside viewDidLoad):



                                                                                            func keyboardWillShow(notification: Notification) {
                                                                                            if let keyboardSize = (notification.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue {
                                                                                            let keyboardHeight = keyboardSize.height
                                                                                            if (view.frame.size.height-self.activeTextField.frame.origin.y) - self.activeTextField.frame.size.height < keyboardHeight{
                                                                                            moveValue = keyboardHeight - ((view.frame.size.height-self.activeTextField.frame.origin.y) - self.activeTextField.frame.size.height)
                                                                                            self.animateViewMoving(up: true, moveValue: moveValue )
                                                                                            moved = true
                                                                                            }
                                                                                            }
                                                                                            }





                                                                                            share|improve this answer














                                                                                            This code moves up the text field you are editing so that you can view it in Swift 3 for this answer you also have to make your view a UITextFieldDelegate:



                                                                                            var moveValue: CGFloat!
                                                                                            var moved: Bool = false
                                                                                            var activeTextField = UITextField()

                                                                                            func textFieldDidBeginEditing(_ textField: UITextField) {
                                                                                            self.activeTextField = textField
                                                                                            }
                                                                                            func textFieldDidEndEditing(_ textField: UITextField) {
                                                                                            if moved == true{
                                                                                            self.animateViewMoving(up: false, moveValue: moveValue )
                                                                                            moved = false
                                                                                            }
                                                                                            }
                                                                                            func animateViewMoving (up:Bool, moveValue :CGFloat){
                                                                                            let movementDuration:TimeInterval = 0.3
                                                                                            let movement:CGFloat = ( up ? -moveValue : moveValue)

                                                                                            UIView.beginAnimations("animateView", context: nil)
                                                                                            UIView.setAnimationBeginsFromCurrentState(true)
                                                                                            UIView.setAnimationDuration(movementDuration)

                                                                                            self.view.frame = self.view.frame.offsetBy(dx: 0, dy: movement)
                                                                                            UIView.commitAnimations()
                                                                                            }


                                                                                            And then in viewDidLoad:



                                                                                            NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillShow), name: .UIKeyboardWillShow, object: nil)


                                                                                            Which calls (outside viewDidLoad):



                                                                                            func keyboardWillShow(notification: Notification) {
                                                                                            if let keyboardSize = (notification.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue {
                                                                                            let keyboardHeight = keyboardSize.height
                                                                                            if (view.frame.size.height-self.activeTextField.frame.origin.y) - self.activeTextField.frame.size.height < keyboardHeight{
                                                                                            moveValue = keyboardHeight - ((view.frame.size.height-self.activeTextField.frame.origin.y) - self.activeTextField.frame.size.height)
                                                                                            self.animateViewMoving(up: true, moveValue: moveValue )
                                                                                            moved = true
                                                                                            }
                                                                                            }
                                                                                            }






                                                                                            share|improve this answer














                                                                                            share|improve this answer



                                                                                            share|improve this answer








                                                                                            edited Feb 5 '17 at 2:47

























                                                                                            answered Jan 30 '17 at 21:54









                                                                                            joshLorjoshLor

                                                                                            487416




                                                                                            487416























                                                                                                0














                                                                                                Swift 3



                                                                                                @IBOutlet var scrollView: UIScrollView!
                                                                                                @IBOutlet var edtEmail: UITextField!
                                                                                                @IBOutlet var bottomTextfieldConstrain: NSLayoutConstraint! // <- this guy is the constrain that connect the bottom of textField to lower object or bottom of page!

                                                                                                @IBAction func edtEmailEditingDidBegin(_ sender: Any) {
                                                                                                self.bottomTextfieldConstrain.constant = 200
                                                                                                let point = CGPoint(x: 0, y: 200)
                                                                                                scrollView.contentOffset = point
                                                                                                }

                                                                                                @IBAction func edtEmailEditingDidEnd(_ sender: Any) {
                                                                                                self.bottomTextfieldConstrain.constant = 50
                                                                                                }





                                                                                                share|improve this answer


























                                                                                                  0














                                                                                                  Swift 3



                                                                                                  @IBOutlet var scrollView: UIScrollView!
                                                                                                  @IBOutlet var edtEmail: UITextField!
                                                                                                  @IBOutlet var bottomTextfieldConstrain: NSLayoutConstraint! // <- this guy is the constrain that connect the bottom of textField to lower object or bottom of page!

                                                                                                  @IBAction func edtEmailEditingDidBegin(_ sender: Any) {
                                                                                                  self.bottomTextfieldConstrain.constant = 200
                                                                                                  let point = CGPoint(x: 0, y: 200)
                                                                                                  scrollView.contentOffset = point
                                                                                                  }

                                                                                                  @IBAction func edtEmailEditingDidEnd(_ sender: Any) {
                                                                                                  self.bottomTextfieldConstrain.constant = 50
                                                                                                  }





                                                                                                  share|improve this answer
























                                                                                                    0












                                                                                                    0








                                                                                                    0






                                                                                                    Swift 3



                                                                                                    @IBOutlet var scrollView: UIScrollView!
                                                                                                    @IBOutlet var edtEmail: UITextField!
                                                                                                    @IBOutlet var bottomTextfieldConstrain: NSLayoutConstraint! // <- this guy is the constrain that connect the bottom of textField to lower object or bottom of page!

                                                                                                    @IBAction func edtEmailEditingDidBegin(_ sender: Any) {
                                                                                                    self.bottomTextfieldConstrain.constant = 200
                                                                                                    let point = CGPoint(x: 0, y: 200)
                                                                                                    scrollView.contentOffset = point
                                                                                                    }

                                                                                                    @IBAction func edtEmailEditingDidEnd(_ sender: Any) {
                                                                                                    self.bottomTextfieldConstrain.constant = 50
                                                                                                    }





                                                                                                    share|improve this answer












                                                                                                    Swift 3



                                                                                                    @IBOutlet var scrollView: UIScrollView!
                                                                                                    @IBOutlet var edtEmail: UITextField!
                                                                                                    @IBOutlet var bottomTextfieldConstrain: NSLayoutConstraint! // <- this guy is the constrain that connect the bottom of textField to lower object or bottom of page!

                                                                                                    @IBAction func edtEmailEditingDidBegin(_ sender: Any) {
                                                                                                    self.bottomTextfieldConstrain.constant = 200
                                                                                                    let point = CGPoint(x: 0, y: 200)
                                                                                                    scrollView.contentOffset = point
                                                                                                    }

                                                                                                    @IBAction func edtEmailEditingDidEnd(_ sender: Any) {
                                                                                                    self.bottomTextfieldConstrain.constant = 50
                                                                                                    }






                                                                                                    share|improve this answer












                                                                                                    share|improve this answer



                                                                                                    share|improve this answer










                                                                                                    answered Mar 15 '17 at 18:37









                                                                                                    AlfiAlfi

                                                                                                    1,26811322




                                                                                                    1,26811322























                                                                                                        0














                                                                                                        The accepted anwser is nearly perfect. But I need to use UIKeyboardFrameEndUserInfoKey instead of UIKeyboardFrameBeginUserInfoKey, because the latter return keyborad height 0. And change the hittest point to the bottom not origin.



                                                                                                            var aRect : CGRect = self.view.frame
                                                                                                        aRect.size.height -= keyboardSize!.height
                                                                                                        if let activeField = self.activeField {
                                                                                                        var point = activeField.frame.origin
                                                                                                        point.y += activeField.frame.size.height
                                                                                                        if (!aRect.contains(point)){
                                                                                                        self.scrollView.scrollRectToVisible(activeField.frame, animated: true)
                                                                                                        }
                                                                                                        }





                                                                                                        share|improve this answer


























                                                                                                          0














                                                                                                          The accepted anwser is nearly perfect. But I need to use UIKeyboardFrameEndUserInfoKey instead of UIKeyboardFrameBeginUserInfoKey, because the latter return keyborad height 0. And change the hittest point to the bottom not origin.



                                                                                                              var aRect : CGRect = self.view.frame
                                                                                                          aRect.size.height -= keyboardSize!.height
                                                                                                          if let activeField = self.activeField {
                                                                                                          var point = activeField.frame.origin
                                                                                                          point.y += activeField.frame.size.height
                                                                                                          if (!aRect.contains(point)){
                                                                                                          self.scrollView.scrollRectToVisible(activeField.frame, animated: true)
                                                                                                          }
                                                                                                          }





                                                                                                          share|improve this answer
























                                                                                                            0












                                                                                                            0








                                                                                                            0






                                                                                                            The accepted anwser is nearly perfect. But I need to use UIKeyboardFrameEndUserInfoKey instead of UIKeyboardFrameBeginUserInfoKey, because the latter return keyborad height 0. And change the hittest point to the bottom not origin.



                                                                                                                var aRect : CGRect = self.view.frame
                                                                                                            aRect.size.height -= keyboardSize!.height
                                                                                                            if let activeField = self.activeField {
                                                                                                            var point = activeField.frame.origin
                                                                                                            point.y += activeField.frame.size.height
                                                                                                            if (!aRect.contains(point)){
                                                                                                            self.scrollView.scrollRectToVisible(activeField.frame, animated: true)
                                                                                                            }
                                                                                                            }





                                                                                                            share|improve this answer












                                                                                                            The accepted anwser is nearly perfect. But I need to use UIKeyboardFrameEndUserInfoKey instead of UIKeyboardFrameBeginUserInfoKey, because the latter return keyborad height 0. And change the hittest point to the bottom not origin.



                                                                                                                var aRect : CGRect = self.view.frame
                                                                                                            aRect.size.height -= keyboardSize!.height
                                                                                                            if let activeField = self.activeField {
                                                                                                            var point = activeField.frame.origin
                                                                                                            point.y += activeField.frame.size.height
                                                                                                            if (!aRect.contains(point)){
                                                                                                            self.scrollView.scrollRectToVisible(activeField.frame, animated: true)
                                                                                                            }
                                                                                                            }






                                                                                                            share|improve this answer












                                                                                                            share|improve this answer



                                                                                                            share|improve this answer










                                                                                                            answered Aug 28 '17 at 10:48









                                                                                                            Victor ChoyVictor Choy

                                                                                                            1,4281220




                                                                                                            1,4281220























                                                                                                                0














                                                                                                                First of all declare a variable to identify your active UITextField.



                                                                                                                Step 1:-



                                                                                                                Like as var activeTextField: UITextField?



                                                                                                                Step 2:-
                                                                                                                After this add these two lines in viewDidLoad.



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

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


                                                                                                                Step 3:-



                                                                                                                Now define these two methods in your controller class.



                                                                                                                func keyboardWillShow(_ notification: NSNotification) {

                                                                                                                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 keyboardWillHide(_ notification: NSNotification) {

                                                                                                                let contentInsets : UIEdgeInsets = UIEdgeInsetsMake(0.0, 0.0, 0.0, 0.0)
                                                                                                                self.scrollView.contentInset = contentInsets
                                                                                                                self.scrollView.scrollIndicatorInsets = contentInsets
                                                                                                                self.view.endEditing(true)
                                                                                                                self.scrollView.isScrollEnabled = true
                                                                                                                }


                                                                                                                func textFieldDidBeginEditing(_ textField: UITextField){

                                                                                                                activeField = textField
                                                                                                                }

                                                                                                                func textFieldDidEndEditing(_ textField: UITextField){

                                                                                                                activeField = nil
                                                                                                                }





                                                                                                                share|improve this answer




























                                                                                                                  0














                                                                                                                  First of all declare a variable to identify your active UITextField.



                                                                                                                  Step 1:-



                                                                                                                  Like as var activeTextField: UITextField?



                                                                                                                  Step 2:-
                                                                                                                  After this add these two lines in viewDidLoad.



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

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


                                                                                                                  Step 3:-



                                                                                                                  Now define these two methods in your controller class.



                                                                                                                  func keyboardWillShow(_ notification: NSNotification) {

                                                                                                                  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 keyboardWillHide(_ notification: NSNotification) {

                                                                                                                  let contentInsets : UIEdgeInsets = UIEdgeInsetsMake(0.0, 0.0, 0.0, 0.0)
                                                                                                                  self.scrollView.contentInset = contentInsets
                                                                                                                  self.scrollView.scrollIndicatorInsets = contentInsets
                                                                                                                  self.view.endEditing(true)
                                                                                                                  self.scrollView.isScrollEnabled = true
                                                                                                                  }


                                                                                                                  func textFieldDidBeginEditing(_ textField: UITextField){

                                                                                                                  activeField = textField
                                                                                                                  }

                                                                                                                  func textFieldDidEndEditing(_ textField: UITextField){

                                                                                                                  activeField = nil
                                                                                                                  }





                                                                                                                  share|improve this answer


























                                                                                                                    0












                                                                                                                    0








                                                                                                                    0






                                                                                                                    First of all declare a variable to identify your active UITextField.



                                                                                                                    Step 1:-



                                                                                                                    Like as var activeTextField: UITextField?



                                                                                                                    Step 2:-
                                                                                                                    After this add these two lines in viewDidLoad.



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

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


                                                                                                                    Step 3:-



                                                                                                                    Now define these two methods in your controller class.



                                                                                                                    func keyboardWillShow(_ notification: NSNotification) {

                                                                                                                    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 keyboardWillHide(_ notification: NSNotification) {

                                                                                                                    let contentInsets : UIEdgeInsets = UIEdgeInsetsMake(0.0, 0.0, 0.0, 0.0)
                                                                                                                    self.scrollView.contentInset = contentInsets
                                                                                                                    self.scrollView.scrollIndicatorInsets = contentInsets
                                                                                                                    self.view.endEditing(true)
                                                                                                                    self.scrollView.isScrollEnabled = true
                                                                                                                    }


                                                                                                                    func textFieldDidBeginEditing(_ textField: UITextField){

                                                                                                                    activeField = textField
                                                                                                                    }

                                                                                                                    func textFieldDidEndEditing(_ textField: UITextField){

                                                                                                                    activeField = nil
                                                                                                                    }





                                                                                                                    share|improve this answer














                                                                                                                    First of all declare a variable to identify your active UITextField.



                                                                                                                    Step 1:-



                                                                                                                    Like as var activeTextField: UITextField?



                                                                                                                    Step 2:-
                                                                                                                    After this add these two lines in viewDidLoad.



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

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


                                                                                                                    Step 3:-



                                                                                                                    Now define these two methods in your controller class.



                                                                                                                    func keyboardWillShow(_ notification: NSNotification) {

                                                                                                                    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 keyboardWillHide(_ notification: NSNotification) {

                                                                                                                    let contentInsets : UIEdgeInsets = UIEdgeInsetsMake(0.0, 0.0, 0.0, 0.0)
                                                                                                                    self.scrollView.contentInset = contentInsets
                                                                                                                    self.scrollView.scrollIndicatorInsets = contentInsets
                                                                                                                    self.view.endEditing(true)
                                                                                                                    self.scrollView.isScrollEnabled = true
                                                                                                                    }


                                                                                                                    func textFieldDidBeginEditing(_ textField: UITextField){

                                                                                                                    activeField = textField
                                                                                                                    }

                                                                                                                    func textFieldDidEndEditing(_ textField: UITextField){

                                                                                                                    activeField = nil
                                                                                                                    }






                                                                                                                    share|improve this answer














                                                                                                                    share|improve this answer



                                                                                                                    share|improve this answer








                                                                                                                    edited Oct 13 '17 at 13:20









                                                                                                                    Juan Serrats

                                                                                                                    1,20951925




                                                                                                                    1,20951925










                                                                                                                    answered Oct 13 '17 at 11:36









                                                                                                                    Hemendra SinghHemendra Singh

                                                                                                                    111




                                                                                                                    111























                                                                                                                        0














                                                                                                                        Swift 4 Updated my solution



                                                                                                                        with constraint animation on keyboard show/hide,
                                                                                                                        enjoy.



                                                                                                                        import Foundation
                                                                                                                        import UIKit

                                                                                                                        class PhoneController: UIViewController, UITextFieldDelegate{

                                                                                                                        var phoneLayoutYConstraint: NSLayoutConstraint?

                                                                                                                        override func viewDidLoad() {

                                                                                                                        super.viewDidLoad()

                                                                                                                        view.backgroundColor = .white

                                                                                                                        NotificationCenter.default.addObserver(self, selector: #selector(handleKeyBoardNotification(_:)), name: NSNotification.Name.UIKeyboardWillShow, object: nil)
                                                                                                                        NotificationCenter.default.addObserver(self, selector: #selector(handleKeyBoardNotification(_:)), name: NSNotification.Name.UIKeyboardWillHide, object: nil)
                                                                                                                        phoneField.delegate = self

                                                                                                                        view.addSubview(phoneField)

                                                                                                                        NSLayoutConstraint.activate([phoneField.heightAnchor.constraint(equalToConstant: 50),
                                                                                                                        phoneField.centerXAnchor.constraint(equalTo: view.centerXAnchor),
                                                                                                                        phoneField.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 20),
                                                                                                                        phoneField.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -20)])

                                                                                                                        phoneLayoutYConstraint = NSLayoutConstraint(item: phoneField, attribute: .bottom, relatedBy: .equal, toItem: view, attribute: .bottom, multiplier: 1, constant: 0)
                                                                                                                        phoneLayoutYConstraint?.isActive = true

                                                                                                                        }

                                                                                                                        let phoneField: UITextField = {
                                                                                                                        let text = UITextField()
                                                                                                                        text.translatesAutoresizingMaskIntoConstraints = false
                                                                                                                        text.keyboardType = .numberPad
                                                                                                                        text.font = UIFont.systemFont(ofSize: 30)
                                                                                                                        text.layer.cornerRadius = 5.0
                                                                                                                        text.layer.masksToBounds = true
                                                                                                                        text.layer.borderColor = UIColor.darkGray.cgColor
                                                                                                                        text.layer.borderWidth = 2.0

                                                                                                                        return text
                                                                                                                        }()


                                                                                                                        override func viewDidDisappear(_ animated: Bool) {
                                                                                                                        super.viewWillDisappear(animated)
                                                                                                                        NotificationCenter.default.removeObserver(self)
                                                                                                                        }

                                                                                                                        func textFieldDidBeginEditing(_ textField: UITextField) {

                                                                                                                        }


                                                                                                                        func textFieldDidEndEditing(_ textField: UITextField) {

                                                                                                                        }

                                                                                                                        func textFieldShouldReturn(_ textField: UITextField) -> Bool {
                                                                                                                        textField.resignFirstResponder()
                                                                                                                        return true
                                                                                                                        }


                                                                                                                        @objc func handleKeyBoardNotification(_ notification: NSNotification) {

                                                                                                                        if let info = notification.userInfo {

                                                                                                                        let keyboardSize = (info[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue.size
                                                                                                                        let isKeyBoardShowing = notification.name == NSNotification.Name.UIKeyboardWillShow

                                                                                                                        var aRect : CGRect = self.phoneField.frame
                                                                                                                        aRect.size.height -= keyboardSize!.height


                                                                                                                        phoneLayoutYConstraint?.constant = isKeyBoardShowing ? -keyboardSize!.height : 0

                                                                                                                        UIView.animate(withDuration: 0, delay: 0, options: .curveEaseOut, animations: {
                                                                                                                        self.view.layoutIfNeeded()
                                                                                                                        }, completion: { (boo) in

                                                                                                                        })

                                                                                                                        }
                                                                                                                        }

                                                                                                                        }





                                                                                                                        share|improve this answer


























                                                                                                                          0














                                                                                                                          Swift 4 Updated my solution



                                                                                                                          with constraint animation on keyboard show/hide,
                                                                                                                          enjoy.



                                                                                                                          import Foundation
                                                                                                                          import UIKit

                                                                                                                          class PhoneController: UIViewController, UITextFieldDelegate{

                                                                                                                          var phoneLayoutYConstraint: NSLayoutConstraint?

                                                                                                                          override func viewDidLoad() {

                                                                                                                          super.viewDidLoad()

                                                                                                                          view.backgroundColor = .white

                                                                                                                          NotificationCenter.default.addObserver(self, selector: #selector(handleKeyBoardNotification(_:)), name: NSNotification.Name.UIKeyboardWillShow, object: nil)
                                                                                                                          NotificationCenter.default.addObserver(self, selector: #selector(handleKeyBoardNotification(_:)), name: NSNotification.Name.UIKeyboardWillHide, object: nil)
                                                                                                                          phoneField.delegate = self

                                                                                                                          view.addSubview(phoneField)

                                                                                                                          NSLayoutConstraint.activate([phoneField.heightAnchor.constraint(equalToConstant: 50),
                                                                                                                          phoneField.centerXAnchor.constraint(equalTo: view.centerXAnchor),
                                                                                                                          phoneField.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 20),
                                                                                                                          phoneField.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -20)])

                                                                                                                          phoneLayoutYConstraint = NSLayoutConstraint(item: phoneField, attribute: .bottom, relatedBy: .equal, toItem: view, attribute: .bottom, multiplier: 1, constant: 0)
                                                                                                                          phoneLayoutYConstraint?.isActive = true

                                                                                                                          }

                                                                                                                          let phoneField: UITextField = {
                                                                                                                          let text = UITextField()
                                                                                                                          text.translatesAutoresizingMaskIntoConstraints = false
                                                                                                                          text.keyboardType = .numberPad
                                                                                                                          text.font = UIFont.systemFont(ofSize: 30)
                                                                                                                          text.layer.cornerRadius = 5.0
                                                                                                                          text.layer.masksToBounds = true
                                                                                                                          text.layer.borderColor = UIColor.darkGray.cgColor
                                                                                                                          text.layer.borderWidth = 2.0

                                                                                                                          return text
                                                                                                                          }()


                                                                                                                          override func viewDidDisappear(_ animated: Bool) {
                                                                                                                          super.viewWillDisappear(animated)
                                                                                                                          NotificationCenter.default.removeObserver(self)
                                                                                                                          }

                                                                                                                          func textFieldDidBeginEditing(_ textField: UITextField) {

                                                                                                                          }


                                                                                                                          func textFieldDidEndEditing(_ textField: UITextField) {

                                                                                                                          }

                                                                                                                          func textFieldShouldReturn(_ textField: UITextField) -> Bool {
                                                                                                                          textField.resignFirstResponder()
                                                                                                                          return true
                                                                                                                          }


                                                                                                                          @objc func handleKeyBoardNotification(_ notification: NSNotification) {

                                                                                                                          if let info = notification.userInfo {

                                                                                                                          let keyboardSize = (info[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue.size
                                                                                                                          let isKeyBoardShowing = notification.name == NSNotification.Name.UIKeyboardWillShow

                                                                                                                          var aRect : CGRect = self.phoneField.frame
                                                                                                                          aRect.size.height -= keyboardSize!.height


                                                                                                                          phoneLayoutYConstraint?.constant = isKeyBoardShowing ? -keyboardSize!.height : 0

                                                                                                                          UIView.animate(withDuration: 0, delay: 0, options: .curveEaseOut, animations: {
                                                                                                                          self.view.layoutIfNeeded()
                                                                                                                          }, completion: { (boo) in

                                                                                                                          })

                                                                                                                          }
                                                                                                                          }

                                                                                                                          }





                                                                                                                          share|improve this answer
























                                                                                                                            0












                                                                                                                            0








                                                                                                                            0






                                                                                                                            Swift 4 Updated my solution



                                                                                                                            with constraint animation on keyboard show/hide,
                                                                                                                            enjoy.



                                                                                                                            import Foundation
                                                                                                                            import UIKit

                                                                                                                            class PhoneController: UIViewController, UITextFieldDelegate{

                                                                                                                            var phoneLayoutYConstraint: NSLayoutConstraint?

                                                                                                                            override func viewDidLoad() {

                                                                                                                            super.viewDidLoad()

                                                                                                                            view.backgroundColor = .white

                                                                                                                            NotificationCenter.default.addObserver(self, selector: #selector(handleKeyBoardNotification(_:)), name: NSNotification.Name.UIKeyboardWillShow, object: nil)
                                                                                                                            NotificationCenter.default.addObserver(self, selector: #selector(handleKeyBoardNotification(_:)), name: NSNotification.Name.UIKeyboardWillHide, object: nil)
                                                                                                                            phoneField.delegate = self

                                                                                                                            view.addSubview(phoneField)

                                                                                                                            NSLayoutConstraint.activate([phoneField.heightAnchor.constraint(equalToConstant: 50),
                                                                                                                            phoneField.centerXAnchor.constraint(equalTo: view.centerXAnchor),
                                                                                                                            phoneField.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 20),
                                                                                                                            phoneField.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -20)])

                                                                                                                            phoneLayoutYConstraint = NSLayoutConstraint(item: phoneField, attribute: .bottom, relatedBy: .equal, toItem: view, attribute: .bottom, multiplier: 1, constant: 0)
                                                                                                                            phoneLayoutYConstraint?.isActive = true

                                                                                                                            }

                                                                                                                            let phoneField: UITextField = {
                                                                                                                            let text = UITextField()
                                                                                                                            text.translatesAutoresizingMaskIntoConstraints = false
                                                                                                                            text.keyboardType = .numberPad
                                                                                                                            text.font = UIFont.systemFont(ofSize: 30)
                                                                                                                            text.layer.cornerRadius = 5.0
                                                                                                                            text.layer.masksToBounds = true
                                                                                                                            text.layer.borderColor = UIColor.darkGray.cgColor
                                                                                                                            text.layer.borderWidth = 2.0

                                                                                                                            return text
                                                                                                                            }()


                                                                                                                            override func viewDidDisappear(_ animated: Bool) {
                                                                                                                            super.viewWillDisappear(animated)
                                                                                                                            NotificationCenter.default.removeObserver(self)
                                                                                                                            }

                                                                                                                            func textFieldDidBeginEditing(_ textField: UITextField) {

                                                                                                                            }


                                                                                                                            func textFieldDidEndEditing(_ textField: UITextField) {

                                                                                                                            }

                                                                                                                            func textFieldShouldReturn(_ textField: UITextField) -> Bool {
                                                                                                                            textField.resignFirstResponder()
                                                                                                                            return true
                                                                                                                            }


                                                                                                                            @objc func handleKeyBoardNotification(_ notification: NSNotification) {

                                                                                                                            if let info = notification.userInfo {

                                                                                                                            let keyboardSize = (info[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue.size
                                                                                                                            let isKeyBoardShowing = notification.name == NSNotification.Name.UIKeyboardWillShow

                                                                                                                            var aRect : CGRect = self.phoneField.frame
                                                                                                                            aRect.size.height -= keyboardSize!.height


                                                                                                                            phoneLayoutYConstraint?.constant = isKeyBoardShowing ? -keyboardSize!.height : 0

                                                                                                                            UIView.animate(withDuration: 0, delay: 0, options: .curveEaseOut, animations: {
                                                                                                                            self.view.layoutIfNeeded()
                                                                                                                            }, completion: { (boo) in

                                                                                                                            })

                                                                                                                            }
                                                                                                                            }

                                                                                                                            }





                                                                                                                            share|improve this answer












                                                                                                                            Swift 4 Updated my solution



                                                                                                                            with constraint animation on keyboard show/hide,
                                                                                                                            enjoy.



                                                                                                                            import Foundation
                                                                                                                            import UIKit

                                                                                                                            class PhoneController: UIViewController, UITextFieldDelegate{

                                                                                                                            var phoneLayoutYConstraint: NSLayoutConstraint?

                                                                                                                            override func viewDidLoad() {

                                                                                                                            super.viewDidLoad()

                                                                                                                            view.backgroundColor = .white

                                                                                                                            NotificationCenter.default.addObserver(self, selector: #selector(handleKeyBoardNotification(_:)), name: NSNotification.Name.UIKeyboardWillShow, object: nil)
                                                                                                                            NotificationCenter.default.addObserver(self, selector: #selector(handleKeyBoardNotification(_:)), name: NSNotification.Name.UIKeyboardWillHide, object: nil)
                                                                                                                            phoneField.delegate = self

                                                                                                                            view.addSubview(phoneField)

                                                                                                                            NSLayoutConstraint.activate([phoneField.heightAnchor.constraint(equalToConstant: 50),
                                                                                                                            phoneField.centerXAnchor.constraint(equalTo: view.centerXAnchor),
                                                                                                                            phoneField.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 20),
                                                                                                                            phoneField.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -20)])

                                                                                                                            phoneLayoutYConstraint = NSLayoutConstraint(item: phoneField, attribute: .bottom, relatedBy: .equal, toItem: view, attribute: .bottom, multiplier: 1, constant: 0)
                                                                                                                            phoneLayoutYConstraint?.isActive = true

                                                                                                                            }

                                                                                                                            let phoneField: UITextField = {
                                                                                                                            let text = UITextField()
                                                                                                                            text.translatesAutoresizingMaskIntoConstraints = false
                                                                                                                            text.keyboardType = .numberPad
                                                                                                                            text.font = UIFont.systemFont(ofSize: 30)
                                                                                                                            text.layer.cornerRadius = 5.0
                                                                                                                            text.layer.masksToBounds = true
                                                                                                                            text.layer.borderColor = UIColor.darkGray.cgColor
                                                                                                                            text.layer.borderWidth = 2.0

                                                                                                                            return text
                                                                                                                            }()


                                                                                                                            override func viewDidDisappear(_ animated: Bool) {
                                                                                                                            super.viewWillDisappear(animated)
                                                                                                                            NotificationCenter.default.removeObserver(self)
                                                                                                                            }

                                                                                                                            func textFieldDidBeginEditing(_ textField: UITextField) {

                                                                                                                            }


                                                                                                                            func textFieldDidEndEditing(_ textField: UITextField) {

                                                                                                                            }

                                                                                                                            func textFieldShouldReturn(_ textField: UITextField) -> Bool {
                                                                                                                            textField.resignFirstResponder()
                                                                                                                            return true
                                                                                                                            }


                                                                                                                            @objc func handleKeyBoardNotification(_ notification: NSNotification) {

                                                                                                                            if let info = notification.userInfo {

                                                                                                                            let keyboardSize = (info[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue.size
                                                                                                                            let isKeyBoardShowing = notification.name == NSNotification.Name.UIKeyboardWillShow

                                                                                                                            var aRect : CGRect = self.phoneField.frame
                                                                                                                            aRect.size.height -= keyboardSize!.height


                                                                                                                            phoneLayoutYConstraint?.constant = isKeyBoardShowing ? -keyboardSize!.height : 0

                                                                                                                            UIView.animate(withDuration: 0, delay: 0, options: .curveEaseOut, animations: {
                                                                                                                            self.view.layoutIfNeeded()
                                                                                                                            }, completion: { (boo) in

                                                                                                                            })

                                                                                                                            }
                                                                                                                            }

                                                                                                                            }






                                                                                                                            share|improve this answer












                                                                                                                            share|improve this answer



                                                                                                                            share|improve this answer










                                                                                                                            answered Nov 16 '17 at 14:51









                                                                                                                            Hattori HanzōHattori Hanzō

                                                                                                                            314315




                                                                                                                            314315























                                                                                                                                0














                                                                                                                                Swift 4



                                                                                                                                You Can Easily Move Up And Down UITextField With Keyboard With Animation



                                                                                                                                enter image description here



                                                                                                                                import UIKit

                                                                                                                                class ViewController: UIViewController {

                                                                                                                                @IBOutlet var textField: UITextField!

                                                                                                                                override func viewDidLoad() {
                                                                                                                                super.viewDidLoad()
                                                                                                                                NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillChange), name: .UIKeyboardWillChangeFrame, object: nil)
                                                                                                                                }

                                                                                                                                override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
                                                                                                                                textField.resignFirstResponder()
                                                                                                                                }

                                                                                                                                @objc func keyboardWillChange(notification: NSNotification) {

                                                                                                                                let duration = notification.userInfo![UIKeyboardAnimationDurationUserInfoKey] as! Double
                                                                                                                                let curve = notification.userInfo![UIKeyboardAnimationCurveUserInfoKey] as! UInt
                                                                                                                                let curFrame = (notification.userInfo![UIKeyboardFrameBeginUserInfoKey] as! NSValue).cgRectValue
                                                                                                                                let targetFrame = (notification.userInfo![UIKeyboardFrameEndUserInfoKey] as! NSValue).cgRectValue
                                                                                                                                let deltaY = targetFrame.origin.y - curFrame.origin.y

                                                                                                                                UIView.animateKeyframes(withDuration: duration, delay: 0.0, options: UIViewKeyframeAnimationOptions(rawValue: curve), animations: {
                                                                                                                                self.textField.frame.origin.y+=deltaY

                                                                                                                                },completion: nil)
                                                                                                                                }





                                                                                                                                share|improve this answer























                                                                                                                                • Again a solution which will push view up unnecessarily even when it is not needed. Please improve your answer it is misleading
                                                                                                                                  – Shivam Pokhriyal
                                                                                                                                  Aug 31 '18 at 18:28
















                                                                                                                                0














                                                                                                                                Swift 4



                                                                                                                                You Can Easily Move Up And Down UITextField With Keyboard With Animation



                                                                                                                                enter image description here



                                                                                                                                import UIKit

                                                                                                                                class ViewController: UIViewController {

                                                                                                                                @IBOutlet var textField: UITextField!

                                                                                                                                override func viewDidLoad() {
                                                                                                                                super.viewDidLoad()
                                                                                                                                NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillChange), name: .UIKeyboardWillChangeFrame, object: nil)
                                                                                                                                }

                                                                                                                                override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
                                                                                                                                textField.resignFirstResponder()
                                                                                                                                }

                                                                                                                                @objc func keyboardWillChange(notification: NSNotification) {

                                                                                                                                let duration = notification.userInfo![UIKeyboardAnimationDurationUserInfoKey] as! Double
                                                                                                                                let curve = notification.userInfo![UIKeyboardAnimationCurveUserInfoKey] as! UInt
                                                                                                                                let curFrame = (notification.userInfo![UIKeyboardFrameBeginUserInfoKey] as! NSValue).cgRectValue
                                                                                                                                let targetFrame = (notification.userInfo![UIKeyboardFrameEndUserInfoKey] as! NSValue).cgRectValue
                                                                                                                                let deltaY = targetFrame.origin.y - curFrame.origin.y

                                                                                                                                UIView.animateKeyframes(withDuration: duration, delay: 0.0, options: UIViewKeyframeAnimationOptions(rawValue: curve), animations: {
                                                                                                                                self.textField.frame.origin.y+=deltaY

                                                                                                                                },completion: nil)
                                                                                                                                }





                                                                                                                                share|improve this answer























                                                                                                                                • Again a solution which will push view up unnecessarily even when it is not needed. Please improve your answer it is misleading
                                                                                                                                  – Shivam Pokhriyal
                                                                                                                                  Aug 31 '18 at 18:28














                                                                                                                                0












                                                                                                                                0








                                                                                                                                0






                                                                                                                                Swift 4



                                                                                                                                You Can Easily Move Up And Down UITextField With Keyboard With Animation



                                                                                                                                enter image description here



                                                                                                                                import UIKit

                                                                                                                                class ViewController: UIViewController {

                                                                                                                                @IBOutlet var textField: UITextField!

                                                                                                                                override func viewDidLoad() {
                                                                                                                                super.viewDidLoad()
                                                                                                                                NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillChange), name: .UIKeyboardWillChangeFrame, object: nil)
                                                                                                                                }

                                                                                                                                override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
                                                                                                                                textField.resignFirstResponder()
                                                                                                                                }

                                                                                                                                @objc func keyboardWillChange(notification: NSNotification) {

                                                                                                                                let duration = notification.userInfo![UIKeyboardAnimationDurationUserInfoKey] as! Double
                                                                                                                                let curve = notification.userInfo![UIKeyboardAnimationCurveUserInfoKey] as! UInt
                                                                                                                                let curFrame = (notification.userInfo![UIKeyboardFrameBeginUserInfoKey] as! NSValue).cgRectValue
                                                                                                                                let targetFrame = (notification.userInfo![UIKeyboardFrameEndUserInfoKey] as! NSValue).cgRectValue
                                                                                                                                let deltaY = targetFrame.origin.y - curFrame.origin.y

                                                                                                                                UIView.animateKeyframes(withDuration: duration, delay: 0.0, options: UIViewKeyframeAnimationOptions(rawValue: curve), animations: {
                                                                                                                                self.textField.frame.origin.y+=deltaY

                                                                                                                                },completion: nil)
                                                                                                                                }





                                                                                                                                share|improve this answer














                                                                                                                                Swift 4



                                                                                                                                You Can Easily Move Up And Down UITextField With Keyboard With Animation



                                                                                                                                enter image description here



                                                                                                                                import UIKit

                                                                                                                                class ViewController: UIViewController {

                                                                                                                                @IBOutlet var textField: UITextField!

                                                                                                                                override func viewDidLoad() {
                                                                                                                                super.viewDidLoad()
                                                                                                                                NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillChange), name: .UIKeyboardWillChangeFrame, object: nil)
                                                                                                                                }

                                                                                                                                override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
                                                                                                                                textField.resignFirstResponder()
                                                                                                                                }

                                                                                                                                @objc func keyboardWillChange(notification: NSNotification) {

                                                                                                                                let duration = notification.userInfo![UIKeyboardAnimationDurationUserInfoKey] as! Double
                                                                                                                                let curve = notification.userInfo![UIKeyboardAnimationCurveUserInfoKey] as! UInt
                                                                                                                                let curFrame = (notification.userInfo![UIKeyboardFrameBeginUserInfoKey] as! NSValue).cgRectValue
                                                                                                                                let targetFrame = (notification.userInfo![UIKeyboardFrameEndUserInfoKey] as! NSValue).cgRectValue
                                                                                                                                let deltaY = targetFrame.origin.y - curFrame.origin.y

                                                                                                                                UIView.animateKeyframes(withDuration: duration, delay: 0.0, options: UIViewKeyframeAnimationOptions(rawValue: curve), animations: {
                                                                                                                                self.textField.frame.origin.y+=deltaY

                                                                                                                                },completion: nil)
                                                                                                                                }






                                                                                                                                share|improve this answer














                                                                                                                                share|improve this answer



                                                                                                                                share|improve this answer








                                                                                                                                edited Jan 26 '18 at 10:28

























                                                                                                                                answered Jan 25 '18 at 19:36









                                                                                                                                ZAFAR007ZAFAR007

                                                                                                                                90411124




                                                                                                                                90411124












                                                                                                                                • Again a solution which will push view up unnecessarily even when it is not needed. Please improve your answer it is misleading
                                                                                                                                  – Shivam Pokhriyal
                                                                                                                                  Aug 31 '18 at 18:28


















                                                                                                                                • Again a solution which will push view up unnecessarily even when it is not needed. Please improve your answer it is misleading
                                                                                                                                  – Shivam Pokhriyal
                                                                                                                                  Aug 31 '18 at 18:28
















                                                                                                                                Again a solution which will push view up unnecessarily even when it is not needed. Please improve your answer it is misleading
                                                                                                                                – Shivam Pokhriyal
                                                                                                                                Aug 31 '18 at 18:28




                                                                                                                                Again a solution which will push view up unnecessarily even when it is not needed. Please improve your answer it is misleading
                                                                                                                                – Shivam Pokhriyal
                                                                                                                                Aug 31 '18 at 18:28











                                                                                                                                0














                                                                                                                                Swift 4.2



                                                                                                                                My solution will (vertically) center the view on a UITextField if its position is under the keyboard.



                                                                                                                                Step 1: Create new swift file and copy-paste UIViewWithKeyboard class.

                                                                                                                                Step 2: In Interface Builder set it as a Custom Class for your top most UIView.



                                                                                                                                import UIKit

                                                                                                                                class UIViewWithKeyboard: UIView {
                                                                                                                                @IBInspectable var offsetMultiplier: CGFloat = 0.75
                                                                                                                                private var keyboardHeight = 0 as CGFloat
                                                                                                                                private weak var activeTextField: UITextField?
                                                                                                                                override func awakeFromNib() {
                                                                                                                                super.awakeFromNib()
                                                                                                                                NotificationCenter.default.addObserver(self, selector: #selector(UIViewWithKeyboard.textDidBeginEditing),
                                                                                                                                name: UITextField.textDidBeginEditingNotification, object: nil)
                                                                                                                                NotificationCenter.default.addObserver(self, selector: #selector(UIViewWithKeyboard.keyboardWillShow),
                                                                                                                                name: UIResponder.keyboardWillShowNotification, object: nil)
                                                                                                                                NotificationCenter.default.addObserver(self, selector: #selector(UIViewWithKeyboard.keyboardWillHide),
                                                                                                                                name: UIResponder.keyboardWillHideNotification, object: nil)
                                                                                                                                }

                                                                                                                                @objc func textDidBeginEditing(_ notification: NSNotification) {
                                                                                                                                self.activeTextField = notification.object as? UITextField
                                                                                                                                }

                                                                                                                                @objc func keyboardWillShow(_ notification: Notification) {
                                                                                                                                if let frameValue = notification.userInfo?[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue {
                                                                                                                                keyboardHeight = frameValue.cgRectValue.size.height
                                                                                                                                if let textField = self.activeTextField {
                                                                                                                                let offset = textField.frame.maxY < frame.maxY - keyboardHeight ? 0
                                                                                                                                : textField.frame.maxY - (frame.maxY - keyboardHeight) * offsetMultiplier
                                                                                                                                self.setView(offset: offset)
                                                                                                                                }
                                                                                                                                }
                                                                                                                                }

                                                                                                                                @objc func keyboardWillHide(_ notification: NSNotification) {
                                                                                                                                self.setView(offset: 0)
                                                                                                                                }

                                                                                                                                func setView(offset: CGFloat) {
                                                                                                                                UIView.animate(withDuration: 0.25) {
                                                                                                                                self.bounds.origin.y = offset
                                                                                                                                }
                                                                                                                                }
                                                                                                                                }





                                                                                                                                share|improve this answer




























                                                                                                                                  0














                                                                                                                                  Swift 4.2



                                                                                                                                  My solution will (vertically) center the view on a UITextField if its position is under the keyboard.



                                                                                                                                  Step 1: Create new swift file and copy-paste UIViewWithKeyboard class.

                                                                                                                                  Step 2: In Interface Builder set it as a Custom Class for your top most UIView.



                                                                                                                                  import UIKit

                                                                                                                                  class UIViewWithKeyboard: UIView {
                                                                                                                                  @IBInspectable var offsetMultiplier: CGFloat = 0.75
                                                                                                                                  private var keyboardHeight = 0 as CGFloat
                                                                                                                                  private weak var activeTextField: UITextField?
                                                                                                                                  override func awakeFromNib() {
                                                                                                                                  super.awakeFromNib()
                                                                                                                                  NotificationCenter.default.addObserver(self, selector: #selector(UIViewWithKeyboard.textDidBeginEditing),
                                                                                                                                  name: UITextField.textDidBeginEditingNotification, object: nil)
                                                                                                                                  NotificationCenter.default.addObserver(self, selector: #selector(UIViewWithKeyboard.keyboardWillShow),
                                                                                                                                  name: UIResponder.keyboardWillShowNotification, object: nil)
                                                                                                                                  NotificationCenter.default.addObserver(self, selector: #selector(UIViewWithKeyboard.keyboardWillHide),
                                                                                                                                  name: UIResponder.keyboardWillHideNotification, object: nil)
                                                                                                                                  }

                                                                                                                                  @objc func textDidBeginEditing(_ notification: NSNotification) {
                                                                                                                                  self.activeTextField = notification.object as? UITextField
                                                                                                                                  }

                                                                                                                                  @objc func keyboardWillShow(_ notification: Notification) {
                                                                                                                                  if let frameValue = notification.userInfo?[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue {
                                                                                                                                  keyboardHeight = frameValue.cgRectValue.size.height
                                                                                                                                  if let textField = self.activeTextField {
                                                                                                                                  let offset = textField.frame.maxY < frame.maxY - keyboardHeight ? 0
                                                                                                                                  : textField.frame.maxY - (frame.maxY - keyboardHeight) * offsetMultiplier
                                                                                                                                  self.setView(offset: offset)
                                                                                                                                  }
                                                                                                                                  }
                                                                                                                                  }

                                                                                                                                  @objc func keyboardWillHide(_ notification: NSNotification) {
                                                                                                                                  self.setView(offset: 0)
                                                                                                                                  }

                                                                                                                                  func setView(offset: CGFloat) {
                                                                                                                                  UIView.animate(withDuration: 0.25) {
                                                                                                                                  self.bounds.origin.y = offset
                                                                                                                                  }
                                                                                                                                  }
                                                                                                                                  }





                                                                                                                                  share|improve this answer


























                                                                                                                                    0












                                                                                                                                    0








                                                                                                                                    0






                                                                                                                                    Swift 4.2



                                                                                                                                    My solution will (vertically) center the view on a UITextField if its position is under the keyboard.



                                                                                                                                    Step 1: Create new swift file and copy-paste UIViewWithKeyboard class.

                                                                                                                                    Step 2: In Interface Builder set it as a Custom Class for your top most UIView.



                                                                                                                                    import UIKit

                                                                                                                                    class UIViewWithKeyboard: UIView {
                                                                                                                                    @IBInspectable var offsetMultiplier: CGFloat = 0.75
                                                                                                                                    private var keyboardHeight = 0 as CGFloat
                                                                                                                                    private weak var activeTextField: UITextField?
                                                                                                                                    override func awakeFromNib() {
                                                                                                                                    super.awakeFromNib()
                                                                                                                                    NotificationCenter.default.addObserver(self, selector: #selector(UIViewWithKeyboard.textDidBeginEditing),
                                                                                                                                    name: UITextField.textDidBeginEditingNotification, object: nil)
                                                                                                                                    NotificationCenter.default.addObserver(self, selector: #selector(UIViewWithKeyboard.keyboardWillShow),
                                                                                                                                    name: UIResponder.keyboardWillShowNotification, object: nil)
                                                                                                                                    NotificationCenter.default.addObserver(self, selector: #selector(UIViewWithKeyboard.keyboardWillHide),
                                                                                                                                    name: UIResponder.keyboardWillHideNotification, object: nil)
                                                                                                                                    }

                                                                                                                                    @objc func textDidBeginEditing(_ notification: NSNotification) {
                                                                                                                                    self.activeTextField = notification.object as? UITextField
                                                                                                                                    }

                                                                                                                                    @objc func keyboardWillShow(_ notification: Notification) {
                                                                                                                                    if let frameValue = notification.userInfo?[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue {
                                                                                                                                    keyboardHeight = frameValue.cgRectValue.size.height
                                                                                                                                    if let textField = self.activeTextField {
                                                                                                                                    let offset = textField.frame.maxY < frame.maxY - keyboardHeight ? 0
                                                                                                                                    : textField.frame.maxY - (frame.maxY - keyboardHeight) * offsetMultiplier
                                                                                                                                    self.setView(offset: offset)
                                                                                                                                    }
                                                                                                                                    }
                                                                                                                                    }

                                                                                                                                    @objc func keyboardWillHide(_ notification: NSNotification) {
                                                                                                                                    self.setView(offset: 0)
                                                                                                                                    }

                                                                                                                                    func setView(offset: CGFloat) {
                                                                                                                                    UIView.animate(withDuration: 0.25) {
                                                                                                                                    self.bounds.origin.y = offset
                                                                                                                                    }
                                                                                                                                    }
                                                                                                                                    }





                                                                                                                                    share|improve this answer














                                                                                                                                    Swift 4.2



                                                                                                                                    My solution will (vertically) center the view on a UITextField if its position is under the keyboard.



                                                                                                                                    Step 1: Create new swift file and copy-paste UIViewWithKeyboard class.

                                                                                                                                    Step 2: In Interface Builder set it as a Custom Class for your top most UIView.



                                                                                                                                    import UIKit

                                                                                                                                    class UIViewWithKeyboard: UIView {
                                                                                                                                    @IBInspectable var offsetMultiplier: CGFloat = 0.75
                                                                                                                                    private var keyboardHeight = 0 as CGFloat
                                                                                                                                    private weak var activeTextField: UITextField?
                                                                                                                                    override func awakeFromNib() {
                                                                                                                                    super.awakeFromNib()
                                                                                                                                    NotificationCenter.default.addObserver(self, selector: #selector(UIViewWithKeyboard.textDidBeginEditing),
                                                                                                                                    name: UITextField.textDidBeginEditingNotification, object: nil)
                                                                                                                                    NotificationCenter.default.addObserver(self, selector: #selector(UIViewWithKeyboard.keyboardWillShow),
                                                                                                                                    name: UIResponder.keyboardWillShowNotification, object: nil)
                                                                                                                                    NotificationCenter.default.addObserver(self, selector: #selector(UIViewWithKeyboard.keyboardWillHide),
                                                                                                                                    name: UIResponder.keyboardWillHideNotification, object: nil)
                                                                                                                                    }

                                                                                                                                    @objc func textDidBeginEditing(_ notification: NSNotification) {
                                                                                                                                    self.activeTextField = notification.object as? UITextField
                                                                                                                                    }

                                                                                                                                    @objc func keyboardWillShow(_ notification: Notification) {
                                                                                                                                    if let frameValue = notification.userInfo?[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue {
                                                                                                                                    keyboardHeight = frameValue.cgRectValue.size.height
                                                                                                                                    if let textField = self.activeTextField {
                                                                                                                                    let offset = textField.frame.maxY < frame.maxY - keyboardHeight ? 0
                                                                                                                                    : textField.frame.maxY - (frame.maxY - keyboardHeight) * offsetMultiplier
                                                                                                                                    self.setView(offset: offset)
                                                                                                                                    }
                                                                                                                                    }
                                                                                                                                    }

                                                                                                                                    @objc func keyboardWillHide(_ notification: NSNotification) {
                                                                                                                                    self.setView(offset: 0)
                                                                                                                                    }

                                                                                                                                    func setView(offset: CGFloat) {
                                                                                                                                    UIView.animate(withDuration: 0.25) {
                                                                                                                                    self.bounds.origin.y = offset
                                                                                                                                    }
                                                                                                                                    }
                                                                                                                                    }






                                                                                                                                    share|improve this answer














                                                                                                                                    share|improve this answer



                                                                                                                                    share|improve this answer








                                                                                                                                    edited Jul 23 '18 at 14:20

























                                                                                                                                    answered Jul 23 '18 at 13:33









                                                                                                                                    scopescope

                                                                                                                                    1,108512




                                                                                                                                    1,108512























                                                                                                                                        0















                                                                                                                                        for swift 4.2.



                                                                                                                                        This will apply to any form. No need of scrollview.




                                                                                                                                        //make a var of uitextfield



                                                                                                                                        var clickedTextField = UITextField()


                                                                                                                                        //in your viewdid load



                                                                                                                                        NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillShow), name:NSNotification.Name.UIKeyboardWillShow, object: nil);
                                                                                                                                        NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillHide), name:NSNotification.Name.UIKeyboardWillHide, object: nil);


                                                                                                                                        //know the clicked text field. probably you are having textfields on the entire screen.



                                                                                                                                         func textFieldDidBeginEditing(_ textField: UITextField) {


                                                                                                                                        clickedTextField = textField


                                                                                                                                        }


                                                                                                                                        //check if the keyboard is covering textfield or not.



                                                                                                                                         @objc func keyboardWillShow(sender: NSNotification,_ textField : UITextField) {
                                                                                                                                        if let keyboardSize = (sender.userInfo?[UIKeyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue {

                                                                                                                                        if clickedTextField.frame.origin.y > keyboardSize.origin.y {
                                                                                                                                        self.view.frame.origin.y = keyboardSize.origin.y - clickedTextField.center.y - 20
                                                                                                                                        }
                                                                                                                                        }


                                                                                                                                        }

                                                                                                                                        @objc func keyboardWillHide(sender: NSNotification) {
                                                                                                                                        self.view.frame.origin.y = 0
                                                                                                                                        }


                                                                                                                                        //return to close keyboard



                                                                                                                                           func textFieldShouldReturn(_ textField: UITextField) -> Bool {   //delegate method
                                                                                                                                        textField.resignFirstResponder()
                                                                                                                                        return true
                                                                                                                                        }


                                                                                                                                        UPDATE :
                                                                                                                                        NSNotification.Name.UIKeyboardWillShow & NSNotification.Name.UIKeyboardWillHide are renamed to UIResponder.keyboardWillShowNotification & UIResponder.keyboardWillHideNotification respectively.






                                                                                                                                        share|improve this answer




























                                                                                                                                          0















                                                                                                                                          for swift 4.2.



                                                                                                                                          This will apply to any form. No need of scrollview.




                                                                                                                                          //make a var of uitextfield



                                                                                                                                          var clickedTextField = UITextField()


                                                                                                                                          //in your viewdid load



                                                                                                                                          NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillShow), name:NSNotification.Name.UIKeyboardWillShow, object: nil);
                                                                                                                                          NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillHide), name:NSNotification.Name.UIKeyboardWillHide, object: nil);


                                                                                                                                          //know the clicked text field. probably you are having textfields on the entire screen.



                                                                                                                                           func textFieldDidBeginEditing(_ textField: UITextField) {


                                                                                                                                          clickedTextField = textField


                                                                                                                                          }


                                                                                                                                          //check if the keyboard is covering textfield or not.



                                                                                                                                           @objc func keyboardWillShow(sender: NSNotification,_ textField : UITextField) {
                                                                                                                                          if let keyboardSize = (sender.userInfo?[UIKeyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue {

                                                                                                                                          if clickedTextField.frame.origin.y > keyboardSize.origin.y {
                                                                                                                                          self.view.frame.origin.y = keyboardSize.origin.y - clickedTextField.center.y - 20
                                                                                                                                          }
                                                                                                                                          }


                                                                                                                                          }

                                                                                                                                          @objc func keyboardWillHide(sender: NSNotification) {
                                                                                                                                          self.view.frame.origin.y = 0
                                                                                                                                          }


                                                                                                                                          //return to close keyboard



                                                                                                                                             func textFieldShouldReturn(_ textField: UITextField) -> Bool {   //delegate method
                                                                                                                                          textField.resignFirstResponder()
                                                                                                                                          return true
                                                                                                                                          }


                                                                                                                                          UPDATE :
                                                                                                                                          NSNotification.Name.UIKeyboardWillShow & NSNotification.Name.UIKeyboardWillHide are renamed to UIResponder.keyboardWillShowNotification & UIResponder.keyboardWillHideNotification respectively.






                                                                                                                                          share|improve this answer


























                                                                                                                                            0












                                                                                                                                            0








                                                                                                                                            0







                                                                                                                                            for swift 4.2.



                                                                                                                                            This will apply to any form. No need of scrollview.




                                                                                                                                            //make a var of uitextfield



                                                                                                                                            var clickedTextField = UITextField()


                                                                                                                                            //in your viewdid load



                                                                                                                                            NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillShow), name:NSNotification.Name.UIKeyboardWillShow, object: nil);
                                                                                                                                            NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillHide), name:NSNotification.Name.UIKeyboardWillHide, object: nil);


                                                                                                                                            //know the clicked text field. probably you are having textfields on the entire screen.



                                                                                                                                             func textFieldDidBeginEditing(_ textField: UITextField) {


                                                                                                                                            clickedTextField = textField


                                                                                                                                            }


                                                                                                                                            //check if the keyboard is covering textfield or not.



                                                                                                                                             @objc func keyboardWillShow(sender: NSNotification,_ textField : UITextField) {
                                                                                                                                            if let keyboardSize = (sender.userInfo?[UIKeyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue {

                                                                                                                                            if clickedTextField.frame.origin.y > keyboardSize.origin.y {
                                                                                                                                            self.view.frame.origin.y = keyboardSize.origin.y - clickedTextField.center.y - 20
                                                                                                                                            }
                                                                                                                                            }


                                                                                                                                            }

                                                                                                                                            @objc func keyboardWillHide(sender: NSNotification) {
                                                                                                                                            self.view.frame.origin.y = 0
                                                                                                                                            }


                                                                                                                                            //return to close keyboard



                                                                                                                                               func textFieldShouldReturn(_ textField: UITextField) -> Bool {   //delegate method
                                                                                                                                            textField.resignFirstResponder()
                                                                                                                                            return true
                                                                                                                                            }


                                                                                                                                            UPDATE :
                                                                                                                                            NSNotification.Name.UIKeyboardWillShow & NSNotification.Name.UIKeyboardWillHide are renamed to UIResponder.keyboardWillShowNotification & UIResponder.keyboardWillHideNotification respectively.






                                                                                                                                            share|improve this answer















                                                                                                                                            for swift 4.2.



                                                                                                                                            This will apply to any form. No need of scrollview.




                                                                                                                                            //make a var of uitextfield



                                                                                                                                            var clickedTextField = UITextField()


                                                                                                                                            //in your viewdid load



                                                                                                                                            NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillShow), name:NSNotification.Name.UIKeyboardWillShow, object: nil);
                                                                                                                                            NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillHide), name:NSNotification.Name.UIKeyboardWillHide, object: nil);


                                                                                                                                            //know the clicked text field. probably you are having textfields on the entire screen.



                                                                                                                                             func textFieldDidBeginEditing(_ textField: UITextField) {


                                                                                                                                            clickedTextField = textField


                                                                                                                                            }


                                                                                                                                            //check if the keyboard is covering textfield or not.



                                                                                                                                             @objc func keyboardWillShow(sender: NSNotification,_ textField : UITextField) {
                                                                                                                                            if let keyboardSize = (sender.userInfo?[UIKeyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue {

                                                                                                                                            if clickedTextField.frame.origin.y > keyboardSize.origin.y {
                                                                                                                                            self.view.frame.origin.y = keyboardSize.origin.y - clickedTextField.center.y - 20
                                                                                                                                            }
                                                                                                                                            }


                                                                                                                                            }

                                                                                                                                            @objc func keyboardWillHide(sender: NSNotification) {
                                                                                                                                            self.view.frame.origin.y = 0
                                                                                                                                            }


                                                                                                                                            //return to close keyboard



                                                                                                                                               func textFieldShouldReturn(_ textField: UITextField) -> Bool {   //delegate method
                                                                                                                                            textField.resignFirstResponder()
                                                                                                                                            return true
                                                                                                                                            }


                                                                                                                                            UPDATE :
                                                                                                                                            NSNotification.Name.UIKeyboardWillShow & NSNotification.Name.UIKeyboardWillHide are renamed to UIResponder.keyboardWillShowNotification & UIResponder.keyboardWillHideNotification respectively.







                                                                                                                                            share|improve this answer














                                                                                                                                            share|improve this answer



                                                                                                                                            share|improve this answer








                                                                                                                                            edited Dec 24 '18 at 10:31









                                                                                                                                            Suhail

                                                                                                                                            185




                                                                                                                                            185










                                                                                                                                            answered Nov 21 '18 at 8:16









                                                                                                                                            rupesh45rupesh45

                                                                                                                                            12




                                                                                                                                            12























                                                                                                                                                -1














                                                                                                                                                The problem like this in ReactNative android and IOS apps is solved by following the below steps.



                                                                                                                                                install the package like this.



                                                                                                                                                 $ npm install --save react-native-keyboard-spacer


                                                                                                                                                Now import keyboard spacer into your js or jsx files in React Native project like this.



                                                                                                                                                 import React, { Component } from 'react';
                                                                                                                                                import KeyboardSpacer from 'react-native-keyboard-spacer';
                                                                                                                                                import { View, Text, TextInput } from 'react-native';

                                                                                                                                                export default class Sample extends Component{
                                                                                                                                                render(){
                                                                                                                                                return(
                                                                                                                                                <View style={{flex: 1}}>
                                                                                                                                                <TextInput
                                                                                                                                                placeholderTextColor="£000000"
                                                                                                                                                underlineColorAndroid="transparent"
                                                                                                                                                keyboardType="default"
                                                                                                                                                maxLength={30}
                                                                                                                                                placeholder={'Enter your text!'} />

                                                                                                                                                <TextInput placeholder={"another text field"} />

                                                                                                                                                <TextInput placeholder={"another text field"} />

                                                                                                                                                {/* now place the below component after your input fields form block or view */}

                                                                                                                                                <KeyboardSpacer/>
                                                                                                                                                </View>
                                                                                                                                                );
                                                                                                                                                }
                                                                                                                                                }


                                                                                                                                                Then the keyboard issue of hiding the text fields while writing will be solved.



                                                                                                                                                   Note: It will work both IOS and Android React Native apps.

                                                                                                                                                Hope It is helpful to others.





                                                                                                                                                share|improve this answer




























                                                                                                                                                  -1














                                                                                                                                                  The problem like this in ReactNative android and IOS apps is solved by following the below steps.



                                                                                                                                                  install the package like this.



                                                                                                                                                   $ npm install --save react-native-keyboard-spacer


                                                                                                                                                  Now import keyboard spacer into your js or jsx files in React Native project like this.



                                                                                                                                                   import React, { Component } from 'react';
                                                                                                                                                  import KeyboardSpacer from 'react-native-keyboard-spacer';
                                                                                                                                                  import { View, Text, TextInput } from 'react-native';

                                                                                                                                                  export default class Sample extends Component{
                                                                                                                                                  render(){
                                                                                                                                                  return(
                                                                                                                                                  <View style={{flex: 1}}>
                                                                                                                                                  <TextInput
                                                                                                                                                  placeholderTextColor="£000000"
                                                                                                                                                  underlineColorAndroid="transparent"
                                                                                                                                                  keyboardType="default"
                                                                                                                                                  maxLength={30}
                                                                                                                                                  placeholder={'Enter your text!'} />

                                                                                                                                                  <TextInput placeholder={"another text field"} />

                                                                                                                                                  <TextInput placeholder={"another text field"} />

                                                                                                                                                  {/* now place the below component after your input fields form block or view */}

                                                                                                                                                  <KeyboardSpacer/>
                                                                                                                                                  </View>
                                                                                                                                                  );
                                                                                                                                                  }
                                                                                                                                                  }


                                                                                                                                                  Then the keyboard issue of hiding the text fields while writing will be solved.



                                                                                                                                                     Note: It will work both IOS and Android React Native apps.

                                                                                                                                                  Hope It is helpful to others.





                                                                                                                                                  share|improve this answer


























                                                                                                                                                    -1












                                                                                                                                                    -1








                                                                                                                                                    -1






                                                                                                                                                    The problem like this in ReactNative android and IOS apps is solved by following the below steps.



                                                                                                                                                    install the package like this.



                                                                                                                                                     $ npm install --save react-native-keyboard-spacer


                                                                                                                                                    Now import keyboard spacer into your js or jsx files in React Native project like this.



                                                                                                                                                     import React, { Component } from 'react';
                                                                                                                                                    import KeyboardSpacer from 'react-native-keyboard-spacer';
                                                                                                                                                    import { View, Text, TextInput } from 'react-native';

                                                                                                                                                    export default class Sample extends Component{
                                                                                                                                                    render(){
                                                                                                                                                    return(
                                                                                                                                                    <View style={{flex: 1}}>
                                                                                                                                                    <TextInput
                                                                                                                                                    placeholderTextColor="£000000"
                                                                                                                                                    underlineColorAndroid="transparent"
                                                                                                                                                    keyboardType="default"
                                                                                                                                                    maxLength={30}
                                                                                                                                                    placeholder={'Enter your text!'} />

                                                                                                                                                    <TextInput placeholder={"another text field"} />

                                                                                                                                                    <TextInput placeholder={"another text field"} />

                                                                                                                                                    {/* now place the below component after your input fields form block or view */}

                                                                                                                                                    <KeyboardSpacer/>
                                                                                                                                                    </View>
                                                                                                                                                    );
                                                                                                                                                    }
                                                                                                                                                    }


                                                                                                                                                    Then the keyboard issue of hiding the text fields while writing will be solved.



                                                                                                                                                       Note: It will work both IOS and Android React Native apps.

                                                                                                                                                    Hope It is helpful to others.





                                                                                                                                                    share|improve this answer














                                                                                                                                                    The problem like this in ReactNative android and IOS apps is solved by following the below steps.



                                                                                                                                                    install the package like this.



                                                                                                                                                     $ npm install --save react-native-keyboard-spacer


                                                                                                                                                    Now import keyboard spacer into your js or jsx files in React Native project like this.



                                                                                                                                                     import React, { Component } from 'react';
                                                                                                                                                    import KeyboardSpacer from 'react-native-keyboard-spacer';
                                                                                                                                                    import { View, Text, TextInput } from 'react-native';

                                                                                                                                                    export default class Sample extends Component{
                                                                                                                                                    render(){
                                                                                                                                                    return(
                                                                                                                                                    <View style={{flex: 1}}>
                                                                                                                                                    <TextInput
                                                                                                                                                    placeholderTextColor="£000000"
                                                                                                                                                    underlineColorAndroid="transparent"
                                                                                                                                                    keyboardType="default"
                                                                                                                                                    maxLength={30}
                                                                                                                                                    placeholder={'Enter your text!'} />

                                                                                                                                                    <TextInput placeholder={"another text field"} />

                                                                                                                                                    <TextInput placeholder={"another text field"} />

                                                                                                                                                    {/* now place the below component after your input fields form block or view */}

                                                                                                                                                    <KeyboardSpacer/>
                                                                                                                                                    </View>
                                                                                                                                                    );
                                                                                                                                                    }
                                                                                                                                                    }


                                                                                                                                                    Then the keyboard issue of hiding the text fields while writing will be solved.



                                                                                                                                                       Note: It will work both IOS and Android React Native apps.

                                                                                                                                                    Hope It is helpful to others.






                                                                                                                                                    share|improve this answer














                                                                                                                                                    share|improve this answer



                                                                                                                                                    share|improve this answer








                                                                                                                                                    edited Nov 16 '18 at 9:50

























                                                                                                                                                    answered Sep 15 '18 at 8:02









                                                                                                                                                    Venkatesh SomuVenkatesh Somu

                                                                                                                                                    1,94621118




                                                                                                                                                    1,94621118






























                                                                                                                                                        draft saved

                                                                                                                                                        draft discarded




















































                                                                                                                                                        Thanks for contributing an answer to Stack Overflow!


                                                                                                                                                        • Please be sure to answer the question. Provide details and share your research!

                                                                                                                                                        But avoid



                                                                                                                                                        • Asking for help, clarification, or responding to other answers.

                                                                                                                                                        • Making statements based on opinion; back them up with references or personal experience.


                                                                                                                                                        To learn more, see our tips on writing great answers.





                                                                                                                                                        Some of your past answers have not been well-received, and you're in danger of being blocked from answering.


                                                                                                                                                        Please pay close attention to the following guidance:


                                                                                                                                                        • Please be sure to answer the question. Provide details and share your research!

                                                                                                                                                        But avoid



                                                                                                                                                        • Asking for help, clarification, or responding to other answers.

                                                                                                                                                        • Making statements based on opinion; back them up with references or personal experience.


                                                                                                                                                        To learn more, see our tips on writing great answers.




                                                                                                                                                        draft saved


                                                                                                                                                        draft discarded














                                                                                                                                                        StackExchange.ready(
                                                                                                                                                        function () {
                                                                                                                                                        StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f28813339%2fmove-a-view-up-only-when-the-keyboard-covers-an-input-field%23new-answer', 'question_page');
                                                                                                                                                        }
                                                                                                                                                        );

                                                                                                                                                        Post as a guest















                                                                                                                                                        Required, but never shown





















































                                                                                                                                                        Required, but never shown














                                                                                                                                                        Required, but never shown












                                                                                                                                                        Required, but never shown







                                                                                                                                                        Required, but never shown

































                                                                                                                                                        Required, but never shown














                                                                                                                                                        Required, but never shown












                                                                                                                                                        Required, but never shown







                                                                                                                                                        Required, but never shown







                                                                                                                                                        Popular posts from this blog

                                                                                                                                                        Costa Masnaga

                                                                                                                                                        Fotorealismo

                                                                                                                                                        Sidney Franklin