Какова стандартная скорость анимации клавиатуры iPhone?

Некоторое время назад я помню, что видел какую-то константу, которая определяла скорость анимации клавиатуры на iPhone, и я не могу на всю жизнь помнить, где я ее видел... любое понимание?

Ответ 1

- (NSTimeInterval)keyboardAnimationDurationForNotification:(NSNotification*)notification
{
    NSDictionary* info = [notification userInfo];
    NSValue* value = [info objectForKey:UIKeyboardAnimationDurationUserInfoKey];
    NSTimeInterval duration = 0;
    [value getValue:&duration];
    return duration;
}

Ответ 2

UIKeyboardAnimationDurationUserInfoKey теперь является объектом NSNumber, что делает код короче.

- (void)keyboardWillShowNotification:(NSNotification *)notification
{
    NSDictionary *info = [notification userInfo];
    NSNumber *number = [info objectForKey:UIKeyboardAnimationDurationUserInfoKey];
    double duration = [number doubleValue];
} 

Ответ 3

Поскольку это первый хит Google, я хотел бы указать, что жесткое кодирование 0,3 будет означать, что ваше представление будет неправильно отображаться, когда международные пользователи (например, японцы) меняются между клавиатурами различного размера (когда это действие должно быть мгновенным).

Всегда использовать словарь пользовательской информации уведомления UIKeyboardAnimationDurationUserInfoKey value - он получает значение 0, когда пользователь щелкает по клавиатуре.

Ответ 4

Чтобы добавить немного больше того, что написал Shaggy Frog. Полная реализация будет примерно такой:

[[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;
}

Ответ 5

UIKeyboardAnimationDurationUserInfoKey Ключ для объекта NSValue, содержащий двойной, который идентифицирует продолжительность анимации в секундах.

Ответ 6

В Swift ваш код будет выглядеть так:

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)

Ответ 7

Swift 4 - работал у меня:

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

В режиме отладки мой duration был 3.499999