Search code examples
swiftanimationkeyboard

The view shifts after the keyboard is finished loading, how to I get the view to shift at the same time


When I call my keyboard it will slide up into place, then the rest of the view will slide up to make room for it. Similarly when I dismiss the keyboard, the keyboard will slide out, then the rest of the view will slide down. Is it possible to have the keyboard and the view to slide at the same time?

Here is the code I currently have

// MARK: Animated Keyboard
@objc func keyboardWillShow(notification: NSNotification) {

    // check to see if a keyboard exists
    if let keyboardSize = (notification.userInfo?[UIResponder.keyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue {
        print("Show")

        // Check to see if the information for the size of the keyboard exists
        guard let userInfo = notification.userInfo
            else {return}

        // get the size of the keyboard
        guard let keyboardSize = userInfo[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue
            else {return}

        // get the duration of the keyboard transition
        let duration = notification.userInfo![UIResponder.keyboardAnimationDurationUserInfoKey] as! Double

        // get the type and speed of the keyboard transition
        let curve = notification.userInfo![UIResponder.keyboardAnimationCurveUserInfoKey] as! UInt

        // move the frame by the size of the keyboard
        let keyboardFrame = keyboardSize.cgRectValue
        UIView.animateKeyframes(withDuration: duration, delay: -0.2, options: UIView.KeyframeAnimationOptions(rawValue: curve), animations: {
            if self.view.frame.origin.y == 0 {
                self.view.frame.origin.y -= keyboardFrame.height
            }
        }, completion: nil)


    }
}   

This is not causing any errors, it compiles and runs without issue. It just looks bad.


Solution

  • From your description is sounds like you have actually registered for keyboardDidShowNotification instead of keyboardWillShowNotification.

    Make sure you have registered for the correct notification.

    You should also use the UIView.animate method and not UIView.animateKeyframes. This of course also means you need to replace UIView.KeyframeAnimationOptions with UIView.AnimationOptions.

    Lastly, don't attempt to use a negative delay. UIKit has a lot of power but time travel isn't one of them.