5

ここで見られる方法を使用して UITableViewCell の高さの変化をアニメーション化する方法を知っています: Can you animate a height change on a UITableViewCell when selected?

ただし、その方法を使用すると、UITableView が同時にスクロールしますが、これは望ましくありません。

セルがほとんどない UITableView があります。画面の高さよりも小さくなります。一番下のセルには UITextField があり、編集を開始するときに、UITableView のコンテンツ オフセットを手動で設定して、UITextField を含むセルが一番上にスクロールされるようにします。次に、UITextField の入力に基づいて、UITableViewCell のサイズを大きくして、多かれ少なかれ追加のオプションを表示したい場合があります。

問題は、この変更をアニメーション化すると、UITableView の位置が変更され、UITextField が上部に表示されなくなることです。

これは、多かれ少なかれ、私がやっていることです:

self.customAmountCellSize = height;

[self.tableView beginUpdates];
[self.tableView endUpdates];

私も試してみました

self.customAmountCellSize = height;
CGPoint originalOffset = self.tableView.contentOffset;

[self.tableView beginUpdates];
[self.tableView endUpdates];

[self.tableView setContentOffset:originalOffset animated:NO];

行の高さのアニメーションが必要です。結果として UITableView をスクロールしたくありません。

何か案は?

4

2 に答える 2

3

発生している問題は、テーブル ビューが一番下までスクロールされているため、コンテンツを更新すると、それを修正しようとすることです。

スクロールを防止するには、次の 2 つの方法があります。

  1. テーブル ビューのコンテンツ インセットを最初の余白の高さに設定します。

    self.tableView.contentInset = UIEdgeInsetsMake(0, 0, verticalGap, 0);
    
  2. 垂直ギャップと同じ高さの空のフッター ビューを追加します。

    self.tableView.tableFooterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 0, verticalGap)];
    

どちらの場合も、達成しようとしている垂直方向のスペースを計算する必要があります。contentInset完了したら、またはtableFooterViewを元の状態に復元する必要があります。

于 2013-09-17T18:42:20.770 に答える
1

セルの高さの変更ではなく、テキスト フィールドがファーストレスポンダーになっているため、テーブル ビューがスクロールしていると思います。セルの高さを同じに保ち、オフセットを調整して確認してください。

私が正しければ、解決策は次のとおりです。 UITableView は、キーボードが表示されると自動的にスクロールしようとします。これを修正するには、メイン キューへのディスパッチで目的のオフセットにコンテンツ オフセットを設定します。これは、次の実行ループの開始時に発生します。UIKeyboardWillShowNotification への応答内、または UITextFieldDelegate shouldBeginEditing メソッド内に次のコードを挿入します。

// Get the current offset prior to the keyboard animation
CGPoint currentOffset = self.tableView.contentOffset;
UIEdgeInsets currentInsets = self.tableView.contentInset;
__weak SomeTableViewControllerClass *weakSelf = self;
dispatch_async(dispatch_get_main_queue(), ^{
    [UIView animationWithDuration:0 animations:{
        // set the content offset back to what it was
        weakSelf.tableView.contentOffset = currentOffset;
        weakSelf.tableView.contentInset = currentInsets;
    } completion:nil];
});

UITableView のフレームやその他の要因によっては、テーブル ビューの contentInset.bottom にも同様の修正が必要になることがあります。

于 2013-09-17T18:36:21.553 に答える