35

自動レイアウトの制約があるテーブルビューをスムーズにアニメーション化しようとして立ち往生しています。.h に制約 "keyboardHeight" への参照があり、これを IB にリンクしました。私がしたいのは、テーブルビューがポップアップしたときにキーボードでアニメーション化することだけです。これが私のコードです:

- (void)keyboardWillShow:(NSNotification *)notification
{
    NSDictionary *info = [notification userInfo];
    NSValue *kbFrame = [info objectForKey:UIKeyboardFrameEndUserInfoKey];
    NSTimeInterval animationDuration = [[info objectForKey:UIKeyboardAnimationDurationUserInfoKey] doubleValue];
    CGRect keyboardFrame = [kbFrame CGRectValue];
    CGFloat height = keyboardFrame.size.height;

    [UIView animateWithDuration:animationDuration animations:^{
        self.keyboardHeight.constant = -height;
        [self.view setNeedsLayout];
    }];
}

問題は、アニメーション ブロックが瞬間的であり、キーボードがアニメーションを終了する前に空白が表示されることです。したがって、基本的には、キーボードがアニメーション化されているため、ビューの白い背景が表示されます。キーボードがアニメーションしている限り、アニメーションを持続させることはできません。

私はこれに間違った方法でアプローチしていますか? 前もって感謝します!

4

4 に答える 4

52

このようにしてみてください:

self.keyboardHeight.constant = -height;
[self.view setNeedsUpdateConstraints];

[UIView animateWithDuration:animationDuration animations:^{
   [self.view layoutIfNeeded];
}];

これは、制約ベースのレイアウトを更新する正しい方法であるため (WWDC によると)、このパターンを覚えておいてください。NSLayoutConstraint後で呼び出す限り、 s を追加または削除することもできますsetNeedsUpdateConstraints

于 2012-10-17T00:58:02.167 に答える
8

次のコードを試してください。この場合、テーブル ビューは画面の下端に配置されます。

- (void)keyboardWillShow:(NSNotification *)notification { // UIKeyboardWillShowNotification

    NSDictionary *info = [notification userInfo];
    NSValue *keyboardFrameValue = [info objectForKey:UIKeyboardFrameEndUserInfoKey];
    NSTimeInterval animationDuration = [[info objectForKey:UIKeyboardAnimationDurationUserInfoKey] doubleValue];
    CGRect keyboardFrame = [keyboardFrameValue CGRectValue];

    BOOL isPortrait = UIDeviceOrientationIsPortrait([UIApplication sharedApplication].statusBarOrientation);
    CGFloat keyboardHeight = isPortrait ? keyboardFrame.size.height : keyboardFrame.size.width;

    // constrBottom is a constraint defining distance between bottom edge of tableView and bottom edge of its superview
    constrBottom.constant = keyboardHeight; 
    // or constrBottom.constant = -keyboardHeight - in case if you create constrBottom in code (NSLayoutConstraint constraintWithItem:...:toItem:...) and set views in inverted order

    [UIView animateWithDuration:animationDuration animations:^{
        [tableView layoutIfNeeded];
    }];
}


- (void)keyboardWillHide:(NSNotification *)notification { // UIKeyboardWillHideNotification

    NSDictionary *info = [notification userInfo];
    NSTimeInterval animationDuration = [[info objectForKey:UIKeyboardAnimationDurationUserInfoKey] doubleValue];

    constrBottom.constant = 0;
    [UIView animateWithDuration:animationDuration animations:^{
        [tableView layoutIfNeeded];
    }];
}
于 2013-07-11T16:05:34.100 に答える