36

A while ago I remember seeing a constant of some kind that defined the animation rate of the Keyboard on the iPhone and I can not for the life of me remember where I saw it....any insight?

ShortCircuit
  • 370
  • 1
  • 4
  • 7
  • 8
    The keyboard style and rotation behavior was changed between 2.2.1 and 3.0; who's to say they won't change the animation rate in later versions? – rpetrich Sep 15 '09 at 21:14
  • An even better answer to this can be found at http://stackoverflow.com/a/19235995/39946 It provides the correct duration and correct animtation curve. – Lena Schimmel Dec 06 '13 at 13:39

7 Answers7

69
- (NSTimeInterval)keyboardAnimationDurationForNotification:(NSNotification*)notification
{
    NSDictionary* info = [notification userInfo];
    NSValue* value = [info objectForKey:UIKeyboardAnimationDurationUserInfoKey];
    NSTimeInterval duration = 0;
    [value getValue:&duration];
    return duration;
}
Shaggy Frog
  • 27,575
  • 16
  • 91
  • 128
16

UIKeyboardAnimationDurationUserInfoKey now is a NSNumber object, that makes the code shorter.

- (void)keyboardWillShowNotification:(NSNotification *)notification
{
    NSDictionary *info = [notification userInfo];
    NSNumber *number = [info objectForKey:UIKeyboardAnimationDurationUserInfoKey];
    double duration = [number doubleValue];
} 
Zhengming Ying
  • 447
  • 4
  • 6
  • One-liner: `double duration = [notification.userInfo[UIKeyboardAnimationDurationUserInfoKey] doubleValue];` – Islam Aug 05 '15 at 06:26
12

Since this is the first google hit, I'd like to point out that hard-coding 0.3 will mean that your view will incorrectly animate when international users (e.g. Japanese) swap between different-sized keyboards (when that action ought to be instant).

Always use the notification's userInfo dictionary's UIKeyboardAnimationDurationUserInfoKey value - it gets set to 0 when the user is flicking through keyboards.

greenlight
  • 121
  • 1
  • 3
  • 3
    NB: at the time of writing (iOS 5.1.1) the default duration is now 0.25s. So like @greenlight says, don't ever hard code this - use the data from the notification's userInfo dictionary. – Simon Whitaker May 24 '12 at 13:56
6

To add a bit more to what Shaggy Frog wrote. The full implementation would be something like:

[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(keyboardMovement:)
                                             name:UIKeyboardWillShowNotification
                                           object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(keyboardMovement:)
                                             name:UIKeyboardWillHideNotification
                                           object:nil];


-(void)keyboardMovement:(NSNotification *)notification{
    if (_numericKeyboardShowing == false){
        [UIView animateWithDuration:[self keyboardAnimationDurationForNotification:notification] delay:0
                        options:UIViewAnimationCurveEaseInOut
                     animations:^ {
                         self.bottomContainerView.center = CGPointMake(self.bottomContainerView.center.x, (self.bottomContainerView.center.y - 218));
                                  }
                     completion:NULL];

    _numericKeyboardShowing = true;
   }
   else{
    [UIView animateWithDuration:[self keyboardAnimationDurationForNotification:notification] delay:0
                        options:UIViewAnimationCurveLinear
                     animations:^ {
                         self.bottomContainerView.center = CGPointMake(self.bottomContainerView.center.x, (self.bottomContainerView.center.y + 218));
                     }
                     completion:NULL];

    _numericKeyboardShowing = false;
}

- (NSTimeInterval)keyboardAnimationDurationForNotification:(NSNotification *)notification
{
    NSDictionary *info      = [notification userInfo];
    NSValue* value          = [info objectForKey:UIKeyboardAnimationDurationUserInfoKey];
    NSTimeInterval duration = 0;
    [value getValue:&duration];
    return duration;
}
Ben Coffman
  • 1,750
  • 1
  • 18
  • 26
2

UIKeyboardAnimationDurationUserInfoKey The key for an NSValue object containing a double that identifies the duration of the animation in seconds.

ennuikiller
  • 46,381
  • 14
  • 112
  • 137
  • Hey mate, is the key UIKeyboardAnimationDurationUserInfoKey in the user info dictionary of the notification???? -thx – ShortCircuit Sep 14 '09 at 04:21
2

In Swift your code will look like this:

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

let animationDuration = ((userInfo[UIKeyboardAnimationDurationUserInfoKey]) as! NSNumber).floatValue
let animationOptions = ((userInfo[UIKeyboardAnimationCurveUserInfoKey]) as! NSNumber).unsignedLongValue

UIView.animateWithDuration(NSTimeInterval(animationDuration), delay: 0,
  options: UIViewAnimationOptions(rawValue: animationOptions),
  animations: { () -> Void in
                self.view.frame.origin.y += keyboardSize.height
                }, 
  completion: nil)
codingFriend1
  • 6,487
  • 6
  • 45
  • 67
2

Swift 4 - worked for me:

        if let duration = notification.userInfo?[UIKeyboardAnimationDurationUserInfoKey] as? Double {
            UIView.animate(withDuration: duration, animations: {
                self.view.layoutIfNeeded()
            })
        }

In debug mode my duration was 3.499999

kuzdu
  • 7,124
  • 1
  • 51
  • 69