48

iPhone 5 シミュレーターで iOS 7.0 の新しいキーボード アニメーションを理解しようとしています。キーボードが表示されたときにサイズを変更したいのですUITableViewが、適切なアニメーションの詳細を取得できません。キーボードが表示または非表示になったときに、オブジェクト
からの情報を使用しています。NSNotification

これが私のログです:

Move keyboard from {{0, 920}, {320, 216}} to {{0, 352}, {320, 216}}
 with duration: 0.400000
 and animation curve: 7

UIViewAnimationCurveEaseInOut = 0
UIViewAnimationCurveEaseIn = 1
UIViewAnimationCurveEaseOut = 2
UIViewAnimationCurveLinear = 3

アニメーション カーブが不明な値です。どうすればよいですか?

4

8 に答える 8

72

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

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

// work

[UIView commitAnimations];

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

于 2013-10-07T22:37:38.277 に答える
47

今、私は解決策を見つけました。{0, 920}のポイントからアニメーションが始まり{0, 352}ます。問題は、UITableViewオブジェクトが のサイズで始まっていたため、アニメーションが開始される前に{160, 568}のサイズを に変更しました。UITableView{160, 920}

不明なアニメーション カーブに関しては、パラメータを に設定してanimationCurve << 16、ビュー アニメーション カーブからビュー アニメーション オプションに変換しました。
この値は、リニア、イーズ イン、イーズ アウト、イーズ イン アウトのアニメーション カーブと等しくありません。

これが私のコードです:

[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(_keyboardWillShow:)
                                             name:UIKeyboardWillShowNotification
                                           object:nil];

と:

- (void)keyboardWillShow:(NSNotification *)aNotification {
    NSDictionary *userInfo = aNotification.userInfo;

    //
    // Get keyboard size.

    NSValue *beginFrameValue = userInfo[UIKeyboardFrameBeginUserInfoKey];
    CGRect keyboardBeginFrame = [self.view convertRect:beginFrameValue.CGRectValue fromView:nil];

    NSValue *endFrameValue = userInfo[UIKeyboardFrameEndUserInfoKey];
    CGRect keyboardEndFrame = [self.view convertRect:endFrameValue.CGRectValue fromView:nil];

    //
    // Get keyboard animation.

    NSNumber *durationValue = userInfo[UIKeyboardAnimationDurationUserInfoKey];
    NSTimeInterval animationDuration = durationValue.doubleValue;

    NSNumber *curveValue = userInfo[UIKeyboardAnimationCurveUserInfoKey];
    UIViewAnimationCurve animationCurve = curveValue.intValue;

    //
    // Create animation.

    CGRect tableViewFrame = self.tableView.frame;
    bTableViewFrame.size.height = (keyboardBeginFrame.origin.y - tableViewFrame.origin.y);
    self.tableView.frame = tableViewFrame;

    void (^animations)() = ^() {
        CGRect tableViewFrame = self.tableView.frame;
        tableViewFrame.size.height = (keyboardEndFrame.origin.y - tableViewFrame.origin.y);
        self.tableView.frame = tableViewFrame;
    };

    //
    // Begin animation.

    [UIView animateWithDuration:animationDuration
                          delay:0.0
                        options:(animationCurve << 16)
                     animations:animations
                     completion:nil];
}
于 2013-09-24T07:51:03.407 に答える
5

代わりに使用してくださいUIKeyboardWillChangeFrameNotification。中国語のキーボードなど、一部の国際キーボードは使用中に高さが変わるためです。また、このコードは、横向きモードでもキーボードの正しい高さを提供します。(注: 以下のコードはAutolayout用です)

//set your observer, in a method like viewDidLoad
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillChange:) name:UIKeyboardWillChangeFrameNotification object:nil];

- (void)keyboardWillChange:(NSNotification *)notification {
    CGRect initialRect = [notification.userInfo[UIKeyboardFrameBeginUserInfoKey] CGRectValue];
    CGFloat initialHeight = self.view.frame.size.height - [self.view convertRect:initialRect fromView:nil].origin.y;
    CGRect keyboardRect = [notification.userInfo[UIKeyboardFrameEndUserInfoKey] CGRectValue];
    CGFloat newHeight = self.view.frame.size.height - [self.view convertRect:keyboardRect fromView:nil].origin.y;
    //set your constraints here, based on initialHeight and newHeight, which are the heights of the keyboard before & after animation.
    [self.contentView setNeedsUpdateConstraints];
    [UIView beginAnimations:nil context:nil];
    [UIView setAnimationDuration:[notification.userInfo[UIKeyboardAnimationDurationUserInfoKey] doubleValue]];
    [UIView setAnimationCurve:[notification.userInfo[UIKeyboardAnimationCurveUserInfoKey] integerValue]];
    [UIView setAnimationBeginsFromCurrentState:YES];
    [self.contentView layoutIfNeeded];
    [UIView commitAnimations];
}
于 2014-08-04T00:39:27.307 に答える
1

iOS 13 では暗黙的なアニメーションを使用しているため、通知ハンドラー内のレイアウトを変更するだけで、正しい期間と曲線でアニメーション化されます。

于 2020-04-17T19:41:09.447 に答える