web-dev-qa-db-ja.com

iPhoneのデフォルトのキーボードアニメーションレートはどれくらいですか?

少し前に、iPhoneのキーボードのアニメーションレートを定義するある種の定数を見たのを覚えていますが、私の人生のどこで見たのか思い出せません。

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

UIKeyboardAnimationDurationUserInfoKeyがNSNumberオブジェクトになり、コードが短くなりました。

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

これはGoogleの最初のヒットであるため、0.3をハードコーディングすると、海外のユーザー(日本人など)が異なるサイズのキーボードを交換したときにビューが誤ってアニメーション化されることを意味します(そのアクションをすぐに実行する必要がある場合)。 。

通知のuserInfoディクショナリのUIKeyboardAnimationDurationUserInfoKey値を常に使用-ユーザーがキーボードをフリックすると、0に設定されます。

11
greenlight

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;
}
6
Ben Coffman

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
codingFriend1

UIKeyboardAnimationDurationUserInfoKeyアニメーションの継続時間を秒単位で識別するdoubleを含むNSValueオブジェクトのキー。

2
ennuikiller

Swift 4-私のために働いた:

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

デバッグモードでは、私のduration3.499999

1
kuzdu