2

ビューの UITableViewCell に UITextField があります。UITextField がキーボードの背後にある可能性があるため、次の 2 つの方法を使用して適切に対処します。1 つはキーボードがクリックされたとき、もう 1 つはキーボードが閉じられたときです。

- (void)keyboardNotification:(NSNotification*)notification {
    CGSize keyboardSize = [[[notification userInfo] objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size;
    CustomCell *cell = (CustomCell*)[[tempTextField superview] superview];
    CGRect textFieldRect = [cell convertRect:tempTextField.frame toView:self.view];
    if (textFieldRect.origin.y + textFieldRect.size.height >= [UIScreen mainScreen].bounds.size.height - keyboardSize.height) {
        thetableView.contentInset =  UIEdgeInsetsMake(0, 0, keyboardSize.height, 0);
        NSIndexPath *pathOfTheCell = [thetableView indexPathForCell:cell];
        [thetableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:pathOfTheCell.row inSection:0] atScrollPosition:UITableViewScrollPositionTop animated:YES];
    }

}

- (void)keyboardhideNotification:(NSNotification*)notification {
    thetableView.contentInset =  UIEdgeInsetsMake(0, 0, 0, 0);
}

現在はある程度うまく機能していますが、2つの問題があります。

  1. ENTIRE UITextField がキーボードの上部より下にある場合、テーブルビューはキーボードの上にのみスクロールします。キーボードが選択されている UITextField の途中にある場合、テーブルビューはキーボードの上までスクロールしません。一見すると、これでうまくいくように見えますが、何かが欠けている可能性があります。

2. キーボードがキーボードの下にあり、テーブルビューが上にスクロールすると、素敵なアニメーションの方法でスクロールしますが、完了をクリックするとすぐに元の位置に戻ります。なぜこれが起こっているのかは明らかですが、テーブルビューがあった古い位置に戻るための素敵なアニメーションをどのように作成すればよいでしょうか?

どんな入力でも大歓迎です!

更新: #1 の問題を見つけることができました。ばかげた間違いでした。その測定値が下向きになるため、textField の高さを原点に追加する必要があります。それでは#2に...

4

1 に答える 1

0

このコードは単純に 1 と 2 の両方を修正しました。

- (void)keyboardNotification:(NSNotification*)notification {
    CGSize keyboardSize = [[[notification userInfo] objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size;
    CustomCell *cell = (CustomCell*)[[tempTextField superview] superview];
    CGRect textFieldRect = [tempTextField convertRect:tempTextField.frame toView:self.view];
    if (textFieldRect.origin.y + textFieldRect.size.height >= [UIScreen mainScreen].bounds.size.height - keyboardSize.height) {
        NSDictionary *info = [notification userInfo];
        NSNumber *number = [info objectForKey:UIKeyboardAnimationDurationUserInfoKey];
        double duration = [number doubleValue];
        [UIView animateWithDuration:duration animations:^{
            thetableView.contentInset =  UIEdgeInsetsMake(0, 0, keyboardSize.height, 0);
        }];
        NSIndexPath *pathOfTheCell = [thetableView indexPathForCell:cell];
        [thetableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:pathOfTheCell.row inSection:0] atScrollPosition:UITableViewScrollPositionMiddle animated:YES];
    }

}

- (void)keyboardhideNotification:(NSNotification*)notification {
    NSDictionary *info = [notification userInfo];
    NSNumber *number = [info objectForKey:UIKeyboardAnimationDurationUserInfoKey];
    double duration = [number doubleValue];
    [UIView animateWithDuration:duration animations:^{
        thetableView.contentInset =  UIEdgeInsetsMake(0, 0, 0, 0);
    }];
}
于 2013-07-11T04:35:51.887 に答える