古いバージョンの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では機能しなくなりました。返された値は正確ではなくなり、[完了]ボタンはキーボードの表示アニメーションを正確に模倣しなくなったようです。
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でも同様に機能します。
私は同じ問題を抱えており、アニメーションを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でも機能するので、ここでリンクします。
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
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と8で機能します。今のところ、これで十分です...
[UIView animateWithDuration:self.animationDuration
delay:0.0
options:UIViewAnimationOptionCurveEaseInOut
animations:^{
[self.view layoutIfNeeded]; completion:^(BOOL finished) {
if (finished)
{
if (completion)
completion();
}
}];
(モバイルSafariが行うのと同様に)ツールバー内にボタンを追加する場合は、プロパティinputAccessoryView
を使用するだけです(UITextField
とUITextView
の両方にあります)。そして、あなた自身のすべてのトラブルを救ってください。この隠された宝石はほとんど知られていません。私がそれに遭遇したのはうれしいです。
IOS 6とiOS 7の両方で機能します。アプリで使用しています Routie 。