web-dev-qa-db-ja.com

iOS 7のキーボードアニメーションを模倣して「完了」ボタンを数字キーボードに追加する方法

古いバージョンの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では機能しなくなりました。返された値は正確ではなくなり、[完了]ボタンはキーボードの表示アニメーションを正確に模倣しなくなったようです。

27
Matt Foley

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でも同様に機能します。

84
David Beck

私は同じ問題を抱えており、アニメーションをiOS 7の次のパラメーターで動作させることができました:

    [UIView animateWithDuration:0.5
                          delay:0
         usingSpringWithDamping:500.0f
          initialSpringVelocity:0.0f
                        options:UIViewAnimationOptionCurveLinear
                     animations:animBlock
                     completion:completionBlock];

EDIT:これらの値はデバッグを通じて取得され、can新しいiOSバージョンで変更します。 @ DavidBeckの答え はiOS 7でも機能するので、ここでリンクします。

23
ZeCodea

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

ただし、UIViewAnimationCurveの宣言は0〜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は、0〜15の値を許可するアニマトンカーブ(20-16 = 4)用に4ビットを予約しているようです(そのため、おそらくより多くの文書化されていない値があります)。

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

options:[[note.userInfo objectForKey:UIKeyboardAnimationCurveUserInfoKey] intValue] << 16
10
dersimn

animateWithDurationブロックを使用して、その中に曲線を設定できます。それはきれいで、うまく機能します。

UIViewAnimationCurve curve = [[notification.userInfo objectForKey:UIKeyboardAnimationCurveUserInfoKey] integerValue];
double duration = [[notification.userInfo objectForKey:UIKeyboardAnimationDurationUserInfoKey] doubleValue];

[UIView animateWithDuration:duration
                    delay:0
                  options:UIViewAnimationOptionBeginFromCurrentState 
               animations:^{
                 [UIView setAnimationCurve:curve];
                 /* ANIMATION HERE */
                 // don't forget layoutIfNeeded if you use autolayout
               }
               completion:nil];

幸せなコーディング!

[〜#〜]更新[〜#〜]

私が作成したシンプルなUIViewControllerカテゴリを使用できます https://github.com/Just-/UIViewController-KeyboardAnimation

7
Anton Gaenko

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

[UIView animateWithDuration:self.animationDuration
                      delay:0.0
                    options:UIViewAnimationOptionCurveEaseInOut
                 animations:^{
                     [self.view layoutIfNeeded]; completion:^(BOOL finished) {
                     if (finished)
                     {
                         if (completion)
                             completion();
                     }
                 }];
0
mickm

(モバイルSafariが行うのと同様に)ツールバー内にボタンを追加する場合は、プロパティinputAccessoryViewを使用するだけです(UITextFieldUITextViewの両方にあります)。そして、あなた自身のすべてのトラブルを救ってください。この隠された宝石はほとんど知られていません。私がそれに遭遇したのはうれしいです。

IOS 6とiOS 7の両方で機能します。アプリで使用しています Routie

0
Lukas Petr