Какова скорость анимации клавиатуры по умолчанию на iPhone? - PullRequest
35 голосов
/ 14 сентября 2009

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

Ответы [ 7 ]

68 голосов
/ 17 сентября 2009
- (NSTimeInterval)keyboardAnimationDurationForNotification:(NSNotification*)notification
{
    NSDictionary* info = [notification userInfo];
    NSValue* value = [info objectForKey:UIKeyboardAnimationDurationUserInfoKey];
    NSTimeInterval duration = 0;
    [value getValue:&duration];
    return duration;
}
16 голосов
/ 10 января 2013

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

- (void)keyboardWillShowNotification:(NSNotification *)notification
{
    NSDictionary *info = [notification userInfo];
    NSNumber *number = [info objectForKey:UIKeyboardAnimationDurationUserInfoKey];
    double duration = [number doubleValue];
} 
11 голосов
/ 01 марта 2012

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

Всегда использовать значение UIKeyboardAnimationDurationUserInfoKey из словаря userInfo уведомления - оно устанавливается в 0, когда пользователь перелистывает клавиатуру.

6 голосов
/ 07 января 2013

Чтобы добавить еще немного к тому, что написал 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;
}
2 голосов
/ 09 июля 2016

В 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)
2 голосов
/ 14 сентября 2009

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

1 голос
/ 20 декабря 2017

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...