Ios 使用Swift使用键盘移动视图

Ios 使用Swift使用键盘移动视图,ios,swift,uikit,nsnotificationcenter,uikeyboard,Ios,Swift,Uikit,Nsnotificationcenter,Uikeyboard,我有一个应用程序,它在视图的下半部分有一个文本字段。 这意味着当我输入文本字段时,键盘会覆盖文本字段 如何在键入时向上移动视图,以便查看正在键入的内容,然后在键盘消失时将其向下移动到原始位置 我到处都找过,但所有的解决方案似乎都是Obj-C,我现在还不能完全转换 任何帮助都将不胜感激。将此添加到您的viewcontroller中。工作起来很有魅力。只需调整值即可 override func viewDidLoad() { super.viewDidLoad() N

我有一个应用程序,它在视图的下半部分有一个文本字段。 这意味着当我输入文本字段时,键盘会覆盖文本字段

如何在键入时向上移动视图,以便查看正在键入的内容,然后在键盘消失时将其向下移动到原始位置

我到处都找过,但所有的解决方案似乎都是Obj-C,我现在还不能完全转换


任何帮助都将不胜感激。

将此添加到您的viewcontroller中。工作起来很有魅力。只需调整值即可

override func viewDidLoad() {
    super.viewDidLoad()        
    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);
}

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

以下是一个解决方案,无需处理从一个文本字段到另一个文本字段的切换:

 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(notification: NSNotification) {            
    if let keyboardSize = (notification.userInfo?[UIKeyboardFrameEndUserInfoKey] as? NSValue)?.CGRectValue() {
        self.view.frame.origin.y -= keyboardSize.height
    }            
}

func keyboardWillHide(notification: NSNotification) {
    self.view.frame.origin.y = 0
}
要解决此问题,请将两个功能
keyboard willshow/Hide
替换为:

func keyboardWillShow(notification: NSNotification) {        
    if let keyboardSize = (notification.userInfo?[UIKeyboardFrameEndUserInfoKey] as? NSValue)?.CGRectValue() {
        if view.frame.origin.y == 0 {
            self.view.frame.origin.y -= keyboardSize.height
        }
    }        
}

func keyboardWillHide(notification: NSNotification) {
    if view.frame.origin.y != 0 {
        self.view.frame.origin.y = 0
    }
}
为SWIFT 3.0编辑: 为SWIFT 4.0编辑:

override func viewDidLoad() {
    super.viewDidLoad()            
    NotificationCenter.default.addObserver(self, selector: #selector(ViewController.keyboardWillShow), name: NSNotification.Name.UIKeyboardWillShow, object: nil)
    NotificationCenter.default.addObserver(self, selector: #selector(ViewController.keyboardWillHide), name: NSNotification.Name.UIKeyboardWillHide, object: nil)    
}

@objc func keyboardWillShow(notification: NSNotification) {        
    if let keyboardSize = (notification.userInfo?[UIKeyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue {
        if self.view.frame.origin.y == 0 {
            self.view.frame.origin.y -= keyboardSize.height
        }
    }        
}

@objc func keyboardWillHide(notification: NSNotification) {
    if self.view.frame.origin.y != 0 {
        self.view.frame.origin.y = 0
    }
}
override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)

    NotificationCenter.default.removeObserver(self, name: UIResponder.keyboardWillChangeFrameNotification, object: nil)
    NotificationCenter.default.removeObserver(self, name: UIResponder.keyboardWillHideNotification, object: nil)
}
为SWIFT 4.2编辑:
我注意到,其他的答案包括从视图中剪下一些顶部。如果只想在不剪切任何内容的情况下调整视图大小,请尝试以下方法:)


此线程上的一个常见答案使用以下代码:

func keyboardWillShow(sender: NSNotification) {
    self.view.frame.origin.y -= 150
}
func keyboardWillHide(sender: NSNotification) {
    self.view.frame.origin.y += 150
}
用一个静态量来抵消你的视图显然有一个问题。它在一个设备上看起来不错,但在任何其他尺寸的配置上看起来都不好。您需要获取键盘高度,并将其用作偏移值

这里有一个解决方案,适用于所有设备并处理边缘情况,即用户在键入时隐藏预测文本字段

解决方案 下面需要注意的重要事项是,我们将self.view.window作为对象参数传入。这将为我们提供来自键盘的数据,例如它的高度

@IBOutlet weak var messageField: UITextField!

override func viewDidLoad() {
    super.viewDidLoad()

    NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("keyboardWillShow:"), name:UIKeyboardWillShowNotification, object: self.view.window)
    NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("keyboardWillHide:"), name:UIKeyboardWillHideNotification, object: self.view.window)
}

func keyboardWillHide(sender: NSNotification) {
    let userInfo: [NSObject : AnyObject] = sender.userInfo!
    let keyboardSize: CGSize = userInfo[UIKeyboardFrameBeginUserInfoKey]!.CGRectValue.size
    self.view.frame.origin.y += keyboardSize.height
}
我们将使它在所有设备上看起来都很漂亮,并处理用户添加或删除预测文本字段的情况

func keyboardWillShow(sender: NSNotification) {
    let userInfo: [NSObject : AnyObject] = sender.userInfo!
    let keyboardSize: CGSize = userInfo[UIKeyboardFrameBeginUserInfoKey]!.CGRectValue.size
    let offset: CGSize = userInfo[UIKeyboardFrameEndUserInfoKey]!.CGRectValue.size

    if keyboardSize.height == offset.height {
        UIView.animateWithDuration(0.1, animations: { () -> Void in
            self.view.frame.origin.y -= keyboardSize.height
        })
    } else {
        UIView.animateWithDuration(0.1, animations: { () -> Void in
            self.view.frame.origin.y += keyboardSize.height - offset.height
        })
    }
}
移除观察员 在离开视图之前,不要忘记移除观察者,以防止不必要的消息被传输

override func viewWillDisappear(animated: Bool) {
    NSNotificationCenter.defaultCenter().removeObserver(self, name: UIKeyboardWillShowNotification, object: self.view.window)
    NSNotificationCenter.defaultCenter().removeObserver(self, name: UIKeyboardWillHideNotification, object: self.view.window)
}

根据评论中的问题进行更新:

override func viewDidLoad() {
    super.viewDidLoad()            
    NotificationCenter.default.addObserver(self, selector: #selector(ViewController.keyboardWillShow), name: NSNotification.Name.UIKeyboardWillShow, object: nil)
    NotificationCenter.default.addObserver(self, selector: #selector(ViewController.keyboardWillHide), name: NSNotification.Name.UIKeyboardWillHide, object: nil)    
}

@objc func keyboardWillShow(notification: NSNotification) {        
    if let keyboardSize = (notification.userInfo?[UIKeyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue {
        if self.view.frame.origin.y == 0 {
            self.view.frame.origin.y -= keyboardSize.height
        }
    }        
}

@objc func keyboardWillHide(notification: NSNotification) {
    if self.view.frame.origin.y != 0 {
        self.view.frame.origin.y = 0
    }
}
override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)

    NotificationCenter.default.removeObserver(self, name: UIResponder.keyboardWillChangeFrameNotification, object: nil)
    NotificationCenter.default.removeObserver(self, name: UIResponder.keyboardWillHideNotification, object: nil)
}
如果有两个或多个文本字段,可以检查view.frame.origin.y是否为零

func keyboardWillShow(sender: NSNotification) {
    let userInfo: [NSObject : AnyObject] = sender.userInfo!

    let keyboardSize: CGSize = userInfo[UIKeyboardFrameBeginUserInfoKey]!.CGRectValue.size
    let offset: CGSize = userInfo[UIKeyboardFrameEndUserInfoKey]!.CGRectValue.size

    if keyboardSize.height == offset.height {
        if self.view.frame.origin.y == 0 {
            UIView.animateWithDuration(0.1, animations: { () -> Void in
                self.view.frame.origin.y -= keyboardSize.height
            })
        }
    } else {
        UIView.animateWithDuration(0.1, animations: { () -> Void in
            self.view.frame.origin.y += keyboardSize.height - offset.height
        })
    }
     print(self.view.frame.origin.y)
}
更新为Swift 3

正如其他人所说,您需要在控制器的viewDidLoad()方法中添加通知观察员,如下所示:

NotificationCenter.default.addObserver(forName: .UIKeyboardWillShow, object: nil, queue: nil)
    { notification in
    self.keyboardWillShow(notification)
    }

NotificationCenter.default.addObserver(forName: .UIKeyboardWillHide, object: nil, queue: nil)
    { notification in
    self.keyboardWillHide(notification)
    }

NotificationCenter.default.addObserver(forName: .UIKeyboardDidShow, object: nil, queue: nil)
    { _ in
    self.enableUserInteraction()
    }

NotificationCenter.default.addObserver(forName: .UIKeyboardDidHide, object: nil, queue: nil)
    { _ in
    self.enableUserInteraction()
    }
记住在适当的地方删除观察者(我在viewwilldemouse()方法中执行此操作)

然后,实现show和hide方法——注意告诉应用程序忽略交互事件的那一行(beginIgnoringInteractionEvents)。这一点很重要,因为如果没有它,用户可能会点击一个字段,甚至是一个滚动视图,并导致第二次移动,从而导致严重的UI故障。在键盘显示和隐藏之前忽略交互事件将防止:

func keyboardWillShow(notification: Notification)
    {
    if let keyboardSize = (notification.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue
        {
        UIApplication.shared.beginIgnoringInteractionEvents()
        self.view.frame.origin.y -= keyboardSize.height
        // add this line if you are shifting a scrollView, as in a chat application
        self.timelineCollectionView.contentInset.top += keyboardSize.height
        }
    }

func keyboardWillHide(notification: Notification)
    {
    if let keyboardSize = (notification.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue
        {
        UIApplication.shared.beginIgnoringInteractionEvents()
        self.view.frame.origin.y += keyboardSize.height
        // add this line if you are shifting a scrollView, as in a chat application
        self.timelineCollectionView.contentInset.top -= keyboardSize.height
        }
    }
最后,重新启用用户交互(请记住,此方法在键盘didShow或didshide后激发):


我看到所有答案都是通过键盘高度的值移动视图本身。好的,我有一个详细的答案,如果您使用约束,即
自动布局
,通过将视图的约束值(例如底部或顶部约束)更改为预定义值来移动视图,或者您可以使用键盘大小值,这可能会很有用

在本例中,我使用从textfield到底部布局视图的底部约束,初始值为175

@IBOutlet weak var bottomConstraint: NSLayoutConstraint!

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(notification: NSNotification) {
    //To retrieve keyboard size, uncomment following line
    //let keyboardSize = (notification.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.CGRectValue()
    bottomConstraint.constant = 260
    UIView.animateWithDuration(0.3) {
        self.view.layoutIfNeeded()
    }
}

func keyboardWillHide(notification: NSNotification) {
    //To retrieve keyboard size, uncomment following line
    //let keyboardSize = (notification.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.CGRectValue()
    bottomConstraint.constant = 175
    UIView.animateWithDuration(0.3) {
        self.view.layoutIfNeeded()
    }
}

最简单的方法,甚至不需要任何代码:

  • 如果尚未使用Spring动画框架,请下载文件并将其添加(拖放)到项目中
  • 在情节提要中,为视图或文本字段创建底部约束,选择约束(双击该约束),然后在标识检查器中,将其类从NSLayoutConstraint更改为KeyboardLayoutConstraint
  • 完成了
    对象将与键盘同步自动向上移动。

    此视频教程是最好的。7分钟长,这会很有意义。这是一个简单的解决方案,当您有多个文本字段,并希望滚动视图在点击特定文本字段时移动“x”像素量

    只需以下步骤:

    -将所有文本字段放置在约束到视图边缘的滚动视图中

    -将所有文本字段和滚动视图作为代理连接到视图控制器

    -连接所有文本字段并使用IBOutlet滚动查看

    class ViewController: UIViewController, UITextFieldDelegate {
    
    -将UITextFieldDelegate协议添加到类中

    @IBOutlet var stateAddress: UITextField!
    @IBOutlet var zipAddress: UITextField!
    @IBOutlet var phoneNumber: UITextField!
    @IBOutlet var vetEmailAddress: UITextField!    
    @IBOutlet weak var scrollView: UIScrollView!
    
    -将UITextFieldDelegate方法添加到swift文件:

    func textFieldShouldReturn(textField: UITextField) -> Bool {
    
        textField.resignFirstResponder()
        return true
    }
    
    
    func textFieldDidBeginEditing(textField: UITextField) {
    
        if (textField == self.stateAddress) {
            scrollView.setContentOffset(CGPointMake(0, 25), animated: true)
        }
        else if (textField == self.zipAddress) {
            scrollView.setContentOffset(CGPointMake(0, 57), animated: true)
        }
        else if (textField == self.phoneNumber) {
            scrollView.setContentOffset(CGPointMake(0, 112), animated: true)
        }
        else if (textField == self.vetEmailAddress) {
            scrollView.setContentOffset(CGPointMake(0, 142), animated: true)
        }
    }
    
    func textFieldDidEndEditing(textField: UITextField) {
    
        scrollView.setContentOffset(CGPointMake(0, 0), animated: true)
    }
    
    第一种方法只是激活键盘上的返回按钮来关闭键盘。第二个是当你点击任何特定的文本字段,然后设置滚动视图滚动距离的y偏移量(我的是基于我的视图控制器25,57112142上的y位置)。最后一个是当你从键盘上轻按时,滚动视图会回到原来的位置

    我用这种方法使我的视图像素完美

    这是我的解决方案(实际上,此代码适用于视图中只有几个文本字段的情况,也适用于只有一个文本字段的情况)


    这项功能是Ios内置的,但我们需要在外部完成。
    插入以下代码
    *要在文本字段位于键盘下方时移动视图,
    *当文本字段位于键盘上方时不移动视图
    *在需要时根据键盘高度移动视图。
    这在所有情况下都有效并经过测试。

    import UIKit
    
    class NamVcc: UIViewController, UITextFieldDelegate
    {
        @IBOutlet weak var NamTxtBoxVid: UITextField!
    
        var VydTxtBoxVar: UITextField!
        var ChkKeyPadDspVar: Bool = false
        var KeyPadHytVal: CGFloat!
    
        override func viewDidLoad()
        {
            super.viewDidLoad()
    
            NamTxtBoxVid.delegate = self
        }
    
        override func viewWillAppear(animated: Bool)
        {
            NSNotificationCenter.defaultCenter().addObserver(self,
                selector: #selector(TdoWenKeyPadVyd(_:)),
                name:UIKeyboardWillShowNotification,
                object: nil);
            NSNotificationCenter.defaultCenter().addObserver(self,
                selector: #selector(TdoWenKeyPadHyd(_:)),
                name:UIKeyboardWillHideNotification,
                object: nil);
        }
    
        func textFieldDidBeginEditing(TxtBoxPsgVar: UITextField)
        {
            self.VydTxtBoxVar = TxtBoxPsgVar
        }
    
        func textFieldDidEndEditing(TxtBoxPsgVar: UITextField)
        {
            self.VydTxtBoxVar = nil
        }
    
        func textFieldShouldReturn(TxtBoxPsgVar: UITextField) -> Bool
        {
            self.VydTxtBoxVar.resignFirstResponder()
            return true
        }
    
        override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?)
        {
            view.endEditing(true)
            super.touchesBegan(touches, withEvent: event)
        }
    
        func TdoWenKeyPadVyd(NfnPsgVar: NSNotification)
        {
            if(!self.ChkKeyPadDspVar)
            {
                self.KeyPadHytVal = (NfnPsgVar.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.CGRectValue().height
    
                var NonKeyPadAraVar: CGRect = self.view.frame
                NonKeyPadAraVar.size.height -= self.KeyPadHytVal
    
                let VydTxtBoxCenVal: CGPoint? = VydTxtBoxVar?.frame.origin
    
                if (!CGRectContainsPoint(NonKeyPadAraVar, VydTxtBoxCenVal!))
                {
                    self.ChkKeyPadDspVar = true
                    UIView.animateWithDuration(1.0,
                        animations:
                        { self.view.frame.origin.y -= (self.KeyPadHytVal)},
                        completion: nil)
                }
                else
                {
                    self.ChkKeyPadDspVar = false
                }
            }
    
        }
    
        func TdoWenKeyPadHyd(NfnPsgVar: NSNotification)
        {
            if (self.ChkKeyPadDspVar)
            {
                self.ChkKeyPadDspVar = false
                UIView.animateWithDuration(1.0,
                    animations:
                    { self.view.frame.origin.y += (self.KeyPadHytVal)},
                    completion: nil)
            }
        }
    
        override func viewDidDisappear(animated: Bool)
        {
            super.viewWillDisappear(animated)
            NSNotificationCenter.defaultCenter().removeObserver(self)
            view.endEditing(true)
            ChkKeyPadDspVar = false
        }
    }
    

    它必须更稳定

    使用以下代码查看单击的UITextField

     override func viewWillAppear(animated: Bool)
     {
     super.viewWillAppear(animated)
    
     NSNotificationCenter.defaultCenter().addObserver(self, selector: "keyboardWillShow:", name: UIKeyboardWillShowNotification, object: nil)
     NSNotificationCenter.defaultCenter().addObserver(self, selector: "keyboardWillHide:", name: UIKeyboardWillHideNotification, object: nil)
    
     }
    
     // MARK: - keyboard
     func keyboardWillShow(notification: NSNotification) 
    {
    
    if let userInfo = notification.userInfo {
    if let keyboardSize = (userInfo[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.CGRectValue() {
    let contentInsets = self.tblView.contentInset as UIEdgeInsets
    self.tblView.contentInset = UIEdgeInsets(top: contentInsets.top, left: contentInsets.left, bottom: keyboardSize.height, right:contentInsets.right)
                        // ...
                    } else {
                        // no UIKeyboardFrameBeginUserInfoKey entry in userInfo
                    }
                } else {
                    // no userInfo dictionary in notification
                }
            }
    
    func keyboardWillHide(notification: NSNotification) 
    {
    let contentInsets = self.tblView.contentInset as UIEdgeInsets
    self.tblView.contentInset = UIEdgeInsets(top: contentInsets.top, left: contentInsets.left, bottom: 0, right:contentInsets.right)
     }
    
    func textFieldDidBeginEditing(textField: UITextField) {
        ViewUpanimateMoving(true, upValue: 100)
    }
    func textFieldDidEndEditing(textField: UITextField) {
        ViewUpanimateMoving(false, upValue: 100)
    }
    func ViewUpanimateMoving (up:Bool, upValue :CGFloat){
        var durationMovement:NSTimeInterval = 0.3
        var movement:CGFloat = ( up ? -upValue : upValue)
        UIView.beginAnimations( "animateView", context: nil)
        UIView.setAnimationBeginsFromCurrentState(true)
        UIView.setAnimationDuration(durationMovement)
        self.view.frame = CGRectOffset(self.view.frame, 0,  movement)
        UIView.commitAnimations()
    }
    

    如果在同一个VC上有两个或多个文本字段,用户点击其中一个,然后点击另一个,而不调用函数keyboardWillHide,则视图将再次向上移动,这是不必要的,因为您将拥有键盘、一个具有键盘高度的空白空间,然后是视图,使用我编辑的答案中的代码:

    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(notification: NSNotification) {
        if let keyboardSize = (notification.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.CGRectValue() {
            self.view.frame.origin.y -= keyboardSize.height
        }
    }
    
    func keyboardWillHide(notification: NSNotification) {
        if let keyboardSize = (notification.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.CGRectValue() {
            self.view.frame.origin.y += keyboardSize.height
        }
    }
    
    要解决此问题,请将两个功能“KeyboardWillShow/Hide”替换为t
        NonKeyPadAraVar.size.height -= self.KeyPadHytVal + 150
    
        { self.view.frame.origin.y -= self.KeyPadHytVal  - 150},
                        completion: nil)
    
        { self.view.frame.origin.y += self.KeyPadHytVal  - 150},
                    completion: nil)
    
    func keyboardWillShow(notification: NSNotification) {
    
        if let keyboardSize = (notification.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.CGRectValue() {
            self.view.frame.origin.y = self.view.frame.height - (self.view.frame.height + keyboardSize.height)
        }
    
    }
    
    func keyboardWillHide(notification: NSNotification) {
            self.view.frame.origin.y = 0
    }
    
     override func viewWillAppear(animated: Bool)
     {
     super.viewWillAppear(animated)
    
     NSNotificationCenter.defaultCenter().addObserver(self, selector: "keyboardWillShow:", name: UIKeyboardWillShowNotification, object: nil)
     NSNotificationCenter.defaultCenter().addObserver(self, selector: "keyboardWillHide:", name: UIKeyboardWillHideNotification, object: nil)
    
     }
    
     // MARK: - keyboard
     func keyboardWillShow(notification: NSNotification) 
    {
    
    if let userInfo = notification.userInfo {
    if let keyboardSize = (userInfo[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.CGRectValue() {
    let contentInsets = self.tblView.contentInset as UIEdgeInsets
    self.tblView.contentInset = UIEdgeInsets(top: contentInsets.top, left: contentInsets.left, bottom: keyboardSize.height, right:contentInsets.right)
                        // ...
                    } else {
                        // no UIKeyboardFrameBeginUserInfoKey entry in userInfo
                    }
                } else {
                    // no userInfo dictionary in notification
                }
            }
    
    func keyboardWillHide(notification: NSNotification) 
    {
    let contentInsets = self.tblView.contentInset as UIEdgeInsets
    self.tblView.contentInset = UIEdgeInsets(top: contentInsets.top, left: contentInsets.left, bottom: 0, right:contentInsets.right)
     }
    
    func textFieldDidBeginEditing(textField: UITextField) {
        ViewUpanimateMoving(true, upValue: 100)
    }
    func textFieldDidEndEditing(textField: UITextField) {
        ViewUpanimateMoving(false, upValue: 100)
    }
    func ViewUpanimateMoving (up:Bool, upValue :CGFloat){
        var durationMovement:NSTimeInterval = 0.3
        var movement:CGFloat = ( up ? -upValue : upValue)
        UIView.beginAnimations( "animateView", context: nil)
        UIView.setAnimationBeginsFromCurrentState(true)
        UIView.setAnimationDuration(durationMovement)
        self.view.frame = CGRectOffset(self.view.frame, 0,  movement)
        UIView.commitAnimations()
    }
    
    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(notification: NSNotification) {
        if let keyboardSize = (notification.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.CGRectValue() {
            self.view.frame.origin.y -= keyboardSize.height
        }
    }
    
    func keyboardWillHide(notification: NSNotification) {
        if let keyboardSize = (notification.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.CGRectValue() {
            self.view.frame.origin.y += keyboardSize.height
        }
    }
    
    func keyboardWillShow(notification: NSNotification) {
     if let keyboardSize = (notification.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.CGRectValue() {
        if view.frame.origin.y == 0{
            self.view.frame.origin.y -= keyboardSize.height
            }
        }
    }
    
    func keyboardWillHide(notification: NSNotification) {
        if let keyboardSize = (notification.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.CGRectValue() {
            if view.frame.origin.y != 0 {
                self.view.frame.origin.y += keyboardSize.height
            }
        }
    }
    
    var activeField: UITextField?
    
    override func viewDidLoad() {
        super.viewDidLoad()
    
        NotificationCenter.default.addObserver(self, selector: #selector(ProfileViewController.keyboardWillShow), name: NSNotification.Name.UIKeyboardWillShow, object: nil)
        NotificationCenter.default.addObserver(self, selector: #selector(ProfileViewController.keyboardWillHide), name: NSNotification.Name.UIKeyboardWillHide, object: nil)
    }
    
    func textFieldDidBeginEditing(_ textField: UITextField){
        activeField = textField
    }
    
    func textFieldDidEndEditing(_ textField: UITextField){
        activeField = nil
    }
    
    func keyboardWillShow(notification: NSNotification) {
        if let keyboardSize = (notification.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue {
            if (self.activeField?.frame.origin.y)! >= keyboardSize.height {
                self.view.frame.origin.y = keyboardSize.height - (self.activeField?.frame.origin.y)!
            } else {
                self.view.frame.origin.y = 0
            }
        }
    }
    
    func keyboardWillHide(notification: NSNotification) {
        self.view.frame.origin.y = 0
    }
    
    func textFieldDidBeginEditing(_ textField: UITextField) { // became first responder
    
        //move textfields up
        let myScreenRect: CGRect = UIScreen.main.bounds
        let keyboardHeight : CGFloat = 216
    
        UIView.beginAnimations( "animateView", context: nil)
        var movementDuration:TimeInterval = 0.35
        var needToMove: CGFloat = 0
    
        var frame : CGRect = self.view.frame
        if (textField.frame.origin.y + textField.frame.size.height + UIApplication.shared.statusBarFrame.size.height > (myScreenRect.size.height - keyboardHeight - 30)) {
            needToMove = (textField.frame.origin.y + textField.frame.size.height + UIApplication.shared.statusBarFrame.size.height) - (myScreenRect.size.height - keyboardHeight - 30);
        }
    
        frame.origin.y = -needToMove
        self.view.frame = frame
        UIView.commitAnimations()
    }
    
    func textFieldDidEndEditing(_ textField: UITextField) {
        //move textfields back down
        UIView.beginAnimations( "animateView", context: nil)
        var movementDuration:TimeInterval = 0.35
        var frame : CGRect = self.view.frame
        frame.origin.y = 0
        self.view.frame = frame
        UIView.commitAnimations()
    }
    
    class SomeClassVC: UIViewController {
    
      //MARK: - Lifecycle
      override func viewDidLoad() {
        super.viewDidLoad()
    
        addKeyboardObservers()
      }
    
      override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(animated)
    
        removeKeyboardObservers()
      }
    
      //MARK: - Overrides
      override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        view.endEditing(true)
      }
    
      //MARK: - Help
      func addKeyboardObservers() {
        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)
      }
    
      func removeKeyboardObservers() {
        NotificationCenter.default.removeObserver(self, name: NSNotification.Name.UIKeyboardWillShow, object: self.view.window)
        NotificationCenter.default.removeObserver(self, name: NSNotification.Name.UIKeyboardWillHide, object: self.view.window)
      }
    
      func keyboardWillShow(notification: NSNotification) {
        let keyboardHeight = (notification.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue.height
        UIView.animate(withDuration: 0.1, animations: { () -> Void in
          self.view.window?.frame.origin.y = -1 * keyboardHeight!
          self.view.layoutIfNeeded()
        })
      }
    
      func keyboardWillHide(notification: NSNotification) {
        UIView.animate(withDuration: 0.1, animations: { () -> Void in
          self.view.window?.frame.origin.y = 0
          self.view.layoutIfNeeded()
        })
      }
    
      func resignTextFieldFirstResponders() {
        for textField in self.view.subviews where textField is UITextField {
          textField.resignFirstResponder()
        }
      }
    
      func resignAllFirstResponders() {
          view.endEditing(true)
      }
    }
    
    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
    
        NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillChange(notification:)), name: UIResponder.keyboardWillChangeFrameNotification, object: nil)
    
        NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillHide), name: UIResponder.keyboardWillHideNotification, object: nil)
    }
    
    func keyboardWillHide() {
        self.view.frame.origin.y = 0
    }
    
    func keyboardWillChange(notification: NSNotification) {
    
        if let keyboardSize = (notification.userInfo?[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue {
            if YOURTEXTVIEW.isFirstResponder {
                self.view.frame.origin.y = -keyboardSize.height
            }
        }
    }
    
    override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(animated)
    
        NotificationCenter.default.removeObserver(self, name: UIResponder.keyboardWillChangeFrameNotification, object: nil)
        NotificationCenter.default.removeObserver(self, name: UIResponder.keyboardWillHideNotification, object: nil)
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()
        self.hideKeyboardWhenTappedAround()
        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)
    }
    
    @objc func keyboardWillShow(notification: NSNotification) {
        if let keyboardSize = (notification.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue {
            if self.view.frame.origin.y == 0{
                self.view.frame.origin.y -= keyboardSize.height
            }
        }
    }
    
    @objc func keyboardWillHide(notification: NSNotification) {
        if let keyboardSize = (notification.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue {
            if self.view.frame.origin.y != 0{
                self.view.frame.origin.y = 0
            }
        }
    }
    
    class ViewController: UIViewController, UITextFieldDelegate {
    
    var textFieldRealYPosition: CGFloat = 0.0
    
    override func viewDidLoad() {
        super.viewDidLoad()
    
        NotificationCenter.default.addObserver(self, selector: #selector(VehiculeViewController.keyboardWillShow), name: NSNotification.Name.UIKeyboardWillShow, object: nil)
        NotificationCenter.default.addObserver(self, selector: #selector(VehiculeViewController.keyboardWillHide), name: NSNotification.Name.UIKeyboardWillHide, object: nil)
    
      // Delegate all textfields
    
    }
    
    
    @objc func keyboardWillShow(notification: NSNotification) {
        if let keyboardSize = (notification.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue {
            let distanceBetweenTextfielAndKeyboard = self.view.frame.height - textFieldRealYPosition - keyboardSize.height
            if distanceBetweenTextfielAndKeyboard < 0 {
                UIView.animate(withDuration: 0.4) {
                    self.view.transform = CGAffineTransform(translationX: 0.0, y: distanceBetweenTextfielAndKeyboard)
                }
            }
        }
    }
    
    
    @objc func keyboardWillHide(notification: NSNotification) {
        UIView.animate(withDuration: 0.4) {
            self.view.transform = .identity
        }
    }
    
    
    func textFieldDidBeginEditing(_ textField: UITextField) {
      textFieldRealYPosition = textField.frame.origin.y + textField.frame.height
      //take in account all superviews from textfield and potential contentOffset if you are using tableview to calculate the real position
    }
    
    var isKeyboardAppear = false
    
    override func viewDidLoad() {
        super.viewDidLoad() 
        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)
    }
    
    @objc func keyboardWillShow(notification: NSNotification) {
        if !isKeyboardAppear {
            if let keyboardSize = (notification.userInfo?[UIKeyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue {
                if self.view.frame.origin.y == 0{
                    self.view.frame.origin.y -= keyboardSize.height
                }
            }
            isKeyboardAppear = true
        }
    }
    
    @objc func keyboardWillHide(notification: NSNotification) {
        if isKeyboardAppear {
            if let keyboardSize = (notification.userInfo?[UIKeyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue {
                if self.view.frame.origin.y != 0{
                    self.view.frame.origin.y += keyboardSize.height
                }
            }
             isKeyboardAppear = false
        }
    }
    
       override func viewDidLoad() {
          super.viewDidLoad()
          NotificationCenter.default.addObserver(self, selector: #selector(RecipeVC.keyboardWillShow), name: UIResponder.keyboardWillShowNotification, object: nil)
    
          NotificationCenter.default.addObserver(self, selector: #selector(RecipeVC.keyboardWillHide), name: UIResponder.keyboardWillHideNotification, object: nil)
       }
    
       @objc func keyboardWillShow(notification: NSNotification) {
        if ((notification.userInfo?[UIResponder.keyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue) != nil {
    
            var userInfo = notification.userInfo!
            var keyboardFrame:CGRect = (userInfo[UIResponder.keyboardFrameEndUserInfoKey] as! NSValue).cgRectValue
            keyboardFrame = self.view.convert(keyboardFrame, from: nil)
    
            var contentInset:UIEdgeInsets = self.tbl.contentInset
              contentInset.bottom = keyboardFrame.size.height
              self.tbl.contentInset = contentInset
        }
    }
    
       @objc func keyboardWillHide(notification: NSNotification) {
        if ((notification.userInfo?[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue) != nil {
            let contentInset:UIEdgeInsets = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0)
            self.tbl.contentInset = contentInset
        }
    }
    
        override func viewDidLoad() {
              super.viewDidLoad()
    
               NotificationCenter.default.addObserver(self, selector: #selector(RecipeVC.keyboardWillShow), name: NSNotification.Name.UIKeyboardWillShow, object: nil)
    
               NotificationCenter.default.addObserver(self, selector: #selector(RecipeVC.keyboardWillHide), name: NSNotification.Name.UIKeyboardWillHide, object: nil)
        }
        func keyboardWillShow(notification: NSNotification) {
             if ((notification.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue) != nil {
             //self.view.frame.origin.y -= keyboardSize.height
             var userInfo = notification.userInfo!
             var keyboardFrame:CGRect = (userInfo[UIKeyboardFrameEndUserInfoKey] as! NSValue).cgRectValue
              keyboardFrame = self.view.convert(keyboardFrame, from: nil)
    
              var contentInset:UIEdgeInsets = self.tbl.contentInset
              contentInset.bottom = keyboardFrame.size.height
              self.tbl.contentInset = contentInset
    
           }
        }
    
        func keyboardWillHide(notification: NSNotification) {
             if ((notification.userInfo?[UIKeyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue) != nil {
             let contentInset:UIEdgeInsets = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0)
             self.tbl.contentInset = contentInset
             }
        }
    
    override func viewDidLoad() {
    super.viewDidLoad()            
    NotificationCenter.default.addObserver(self, selector: #selector(ViewController.keyboardWillShow), name: NSNotification.Name.UIKeyboardWillShow, object: nil)
    NotificationCenter.default.addObserver(self, selector: #selector(ViewController.keyboardWillHide), name: NSNotification.Name.UIKeyboardWillHide, object: nil)}
    
    @objc func keyboardWillShow(notification: NSNotification) {        
    if let keyboardSize = (notification.userInfo?[UIKeyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue {
        if self.view.frame.origin.y == 0{
            self.view.frame.origin.y -= keyboardSize.height
        }
    }}    
    
    @objc func keyboardWillHide(notification: NSNotification) {
    if let keyboardSize = (notification.userInfo?[UIKeyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue {
        if self.view.frame.origin.y != 0{
            self.view.frame.origin.y = 0 
        }
    } }
    
    NotificationCenter.default.addObserver(self, selector: #selector(ViewController.keyboardWillShow), name: UIResponder.keyboardWillShowNotification, object: nil)
    NotificationCenter.default.addObserver(self, selector: #selector(ViewController.keyboardWillHide), name: UIResponder.keyboardWillHideNotification, object: nil)
    
    
    @objc func keyboardWillShow(_ notification:Notification) {
        if let keyboardSize = (notification.userInfo?[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue {
            self.view.frame.origin.y -= keyboardSize.height
        }
    }
    
    @objc func keyboardWillHide(_ notification:Notification) {
        if let keyboardSize = (notification.userInfo?[UIResponder.keyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue {
            self.view.frame.origin.y += keyboardSize.height
        }
    }
    
    @IBOutlet private var bottomLayoutConstraint: NSLayoutConstraint!
    
    // In ViewDidLoad
        NotificationCenter.default.addObserver(self, selector: #selector(?MyViewController.keyboardDidChange), name: UIResponder.keyboardWillChangeFrameNotification, object: nil)
    
    
    @objc func keyboardDidChange(notification: Notification) {
        let userInfo = notification.userInfo! as [AnyHashable: Any]
        let endFrame = (userInfo[UIResponder.keyboardFrameEndUserInfoKey] as! NSValue).cgRectValue
        let animationDuration = userInfo[UIResponder.keyboardAnimationDurationUserInfoKey] as! NSNumber
        let animationCurve = userInfo[UIResponder.keyboardAnimationCurveUserInfoKey] as! NSNumber
        bottomLayoutConstraint.constant = view.frame.height - endFrame.origin.y - view.safeAreaInsets.bottom // If your constraint is not defined as a safeArea constraint you might want to skip the last part.
        // Prevents iPad undocked keyboard.
        guard endFrame.height != 0, view.frame.height == endFrame.height + endFrame.origin.y else {
            bottomLayoutConstraint.constant = 0
            return
        }
        UIView.setAnimationCurve(UIView.AnimationCurve(rawValue: animationCurve.intValue)!)
        UIView.animate(withDuration: animationDuration.doubleValue) {
            self.view.layoutIfNeeded()
            // Do additional tasks such as scrolling in a UICollectionView
        }
    }
    
    pod 'IQKeyboardManagerSwift'
    
    import IQKeyboardManagerSwift
    
    @UIApplicationMain
    class AppDelegate: UIResponder, UIApplicationDelegate {
    
        var window: UIWindow?
    
        func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
    
          IQKeyboardManager.shared.enable = true // just add this line
    
          return true
        }
    }
    
    extension UIViewController {
        func addKeyboardObserver() {
            NotificationCenter.default.addObserver(self, selector: #selector(keyboardNotifications(notification:)),
                                                   name: UIResponder.keyboardWillChangeFrameNotification,
                                                   object: nil)
        }
    
        func removeKeyboardObserver(){
            NotificationCenter.default.removeObserver(self, name: UIResponder.keyboardWillChangeFrameNotification, object: nil)
        }
    
        // This method will notify when keyboard appears/ dissapears
        @objc func keyboardNotifications(notification: NSNotification) {
    
            var txtFieldY : CGFloat = 0.0  //Using this we will calculate the selected textFields Y Position
            let spaceBetweenTxtFieldAndKeyboard : CGFloat = 5.0 //Specify the space between textfield and keyboard
    
    
            var frame = CGRect(x: 0, y: 0, width: 0, height: 0)
            if let activeTextField = UIResponder.currentFirst() as? UITextField ?? UIResponder.currentFirst() as? UITextView {
                // Here we will get accurate frame of textField which is selected if there are multiple textfields
                frame = self.view.convert(activeTextField.frame, from:activeTextField.superview)
                txtFieldY = frame.origin.y + frame.size.height
            }
    
            if let userInfo = notification.userInfo {
                // here we will get frame of keyBoard (i.e. x, y, width, height)
                let keyBoardFrame = (userInfo[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue
                let keyBoardFrameY = keyBoardFrame!.origin.y
                let keyBoardFrameHeight = keyBoardFrame!.size.height
    
                var viewOriginY: CGFloat = 0.0
                //Check keyboards Y position and according to that move view up and down
                if keyBoardFrameY >= UIScreen.main.bounds.size.height {
                    viewOriginY = 0.0
                } else {
                    // if textfields y is greater than keyboards y then only move View to up
                    if txtFieldY >= keyBoardFrameY {
    
                        viewOriginY = (txtFieldY - keyBoardFrameY) + spaceBetweenTxtFieldAndKeyboard
    
                        //This condition is just to check viewOriginY should not be greator than keyboard height
                        // if its more than keyboard height then there will be black space on the top of keyboard.
                        if viewOriginY > keyBoardFrameHeight { viewOriginY = keyBoardFrameHeight }
                    }
                }
    
                //set the Y position of view
                self.view.frame.origin.y = -viewOriginY
            }
        }
    }
    
    extension UIResponder {
    
        static weak var responder: UIResponder?
    
        static func currentFirst() -> UIResponder? {
            responder = nil
            UIApplication.shared.sendAction(#selector(trap), to: nil, from: nil, for: nil)
            return responder
        }
    
        @objc private func trap() {
            UIResponder.responder = self
        }
    }
    
       override func viewWillAppear(_ animated: Bool) {
            self.addKeyboardObserver()
        }
    
        override func viewWillDisappear(_ animated: Bool) {
            self.removeKeyboardObserver()
        }
    
    override func viewDidLoad() {
        NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillShow), name: UIResponder.keyboardWillShowNotification, object: nil)
        NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillHide), name: UIResponder.keyboardWillHideNotification, object: nil)
    }
    
    @IBAction func keyboardWillShow(notification: NSNotification) {
        if let keyboardSize = (notification.userInfo?[UIResponder.keyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue {
            if self.view.frame.origin.y == 0 {
                self.view.frame.origin.y -= keyboardSize.height
            }
        }
    }
    
    @IBAction func keyboardWillHide(notification: NSNotification) {
        if self.view.frame.origin.y != 0 {
            self.view.frame.origin.y = 0
        }
    }