27

以前のバージョンの iOS でキーボード アニメーションを模倣するために、このようなことをしていました。

CGRect keyboardBeginFrame;
[[note.userInfo objectForKey:UIKeyboardFrameBeginUserInfoKey] getValue:&keyboardBeginFrame];
self.doneKeyboardButton.frame = CGRectMake(0, (keyboardBeginFrame.origin.y + keyboardBeginFrame.size.height) - 53, 106, 53);
[[[[UIApplication sharedApplication] windows] lastObject] addSubview:self.doneKeyboardButton];

CGPoint newCenter = CGPointMake(self.doneKeyboardButton.superview.frame.origin.x + self.doneKeyboardButton.frame.size.width/2,
                                self.doneKeyboardButton.superview.frame.size.height - self.doneKeyboardButton.frame.size.height/2);

[UIView animateWithDuration:[[note.userInfo objectForKey:UIKeyboardAnimationDurationUserInfoKey] floatValue]-.02
                      delay:.0
                    options:[[note.userInfo objectForKey:UIKeyboardAnimationCurveUserInfoKey] intValue]
                 animations:^{
                     self.contentView.frame = CGRectOffset(self.contentView.frame, 0, -TextFieldViewMovement);
                     self.doneKeyboardButton.center = newCenter;
                 }
                 completion:nil];

ただし、これは iOS7 では機能しなくなりました。返された値が正確ではなくなり、[完了] ボタンがキーボードの表示アニメーションを正確に模倣しなくなったようです。

4

7 に答える 7

84

iOS 7 では、キーボードは文書化されていない新しいアニメーション カーブを使用します。アニメーションオプションに文書化されていない値を使用するとうまくいくと指摘する人もいますが、私は次の値を使用することを好みます。

[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:[notification.userInfo[UIKeyboardAnimationDurationUserInfoKey] doubleValue]];
[UIView setAnimationCurve:[notification.userInfo[UIKeyboardAnimationCurveUserInfoKey] unsignedIntegerValue]];
[UIView setAnimationBeginsFromCurrentState:YES];

// work

[UIView commitAnimations];

ブロック ベースのアニメーションが推奨されますが、キーボード通知から返されるアニメーション カーブは でありUIViewAnimationCurve、ブロック ベースのアニメーションに渡す必要があるオプションは ですUIViewAnimationOptions。従来の UIView アニメーション メソッドを使用すると、値を直接パイプすることができます。最も重要なことは、これにより、ドキュメントに記載されていない新しいアニメーション カーブ (7 の整数値) が使用され、アニメーションがキーボードと一致するようになります。また、iOS 6 および 7 でも同様に機能します。

于 2013-10-07T22:36:05.067 に答える
10

Apple は、iOS 7 で値が 7 の文書化されていないアニメーションを使用しています。

ただし、 の宣言はUIViewAnimationCurve0 ~ 3 の値を定義します

typedef enum {
   UIViewAnimationCurveEaseInOut, // 0
   UIViewAnimationCurveEaseIn,
   UIViewAnimationCurveEaseOut,
   UIViewAnimationCurveLinear // 3
} UIViewAnimationCurve;

ブロックベースのUIViewAnimationOptionsアニメーションに必要なものは次のように定義されています

enum {
   // ...
   UIViewAnimationOptionCurveEaseInOut            = 0 << 16,
   UIViewAnimationOptionCurveEaseIn               = 1 << 16,
   UIViewAnimationOptionCurveEaseOut              = 2 << 16,
   UIViewAnimationOptionCurveLinear               = 3 << 16,

   UIViewAnimationOptionTransitionNone            = 0 << 20,
   // ...
};

Apple は、アニメーション カーブ (20 - 16 = 4) 用に 4 ビットを予約しているようです。これにより、0 から 15 までの値が許可されます (したがって、文書化されていない値がさらに存在する可能性があります)。

この知識があれば、約 16 ビットをシフトするだけでUIViewAnimationCurveを に変換できます。UIViewAnimationOptionsあなたの例では、これは次のことを意味します:

options:[[note.userInfo objectForKey:UIKeyboardAnimationCurveUserInfoKey] intValue] << 16
于 2013-12-25T02:46:51.237 に答える
0

これは私にとってはうまく機能しています...キーボードが表示されているときに期間がキャッチされます。オプションをハードコーディングすると、将来壊れる可能性があることはわかっていますが、7 と 8 で機能します。今のところはこれで十分です...

[UIView animateWithDuration:self.animationDuration
                      delay:0.0
                    options:UIViewAnimationOptionCurveEaseInOut
                 animations:^{
                     [self.view layoutIfNeeded]; completion:^(BOOL finished) {
                     if (finished)
                     {
                         if (completion)
                             completion();
                     }
                 }];
于 2015-01-23T22:53:40.090 に答える