2

現在の位置を維持し、変更によって高さの変更をアニメーション化しながら、UITableView 内のすべてのセルを拡大/縮小できるようにしたいと考えています。基本的に、ビュー内の現在のセルが拡大/縮小しているように見え、スクロール位置は同じままです。

高さの異なる2つの状態を持ち、呼び出すことで、セルを拡張/接触させることができます

[self.tableView reloadSections:[NSIndexSet indexSetWithIndex:0] withRowAnimation:UITableViewRowAnimationAutomatic];

そして、私は次のようにして同じ立場を維持しようとしました(この計算が100%正しいわけではありません):

        //calculate the new position it should scroll to based on new cell height
        CGFloat posFromTop = self.tableView.contentOffset.y;
        CGFloat newDistance = 0;

            if(expandedState)
            {
                CGFloat cellsFromTop = posFromTop / kExpandedCellHeight;
                newDistance = cellsFromTop * kCollapsedCellHeight;
            }
            else
            {
                CGFloat cellsFromTop = posFromTop / kMGLCollapsedCellHeight;
                newDistance = cellsFromTop * kMGLExpandedCellHeight;
            }
        }

//reload section
        [self.tableView setContentOffset:CGPointMake(0, newDistance) animated:YES];
        [self.tableView reloadSections:[NSIndexSet indexSetWithIndex:0] withRowAnimation:UITableViewRowAnimationAutomatic];

これは機能しているように見えますが、アニメーションの際に位置が保持されず、白く点滅するため途切れ途切れになり、リロード中に tableView が静止しているようには見えません。

同じ位置を維持しながら、すべてのセルの高さをスムーズにアニメーション化する方法はありますか?

4

2 に答える 2

0

最初の崩壊アニメーションを実行するのにかかる時間をおそらく知ることができます。正確に 1 秒かかるとしましょう。すると、次のように言えると思います。

[UIView animateWithDuration:1.0 animations:^{
    [self.tableView setContentOffset:CGPointMake(0, newDistance) animated:NO];
}]; 

これにより、tableView が現在の contentOffset で開始され、必要な contentOffset で終了するアニメーションが 1 秒間実行されます。、またはアニメーションを tableView に使用したことはまったくありUITableViewRowAnimationAutomaticませんが、他の値も試すことができるかもしれません。

実際、私の言いたいことがわかっていれば、これらのアクションを両方とも同じアニメーションに収めることができるかもしれません。これにより、すべての期間を制御することもできます。それが機能するかどうかはわかりません。今はテストできませんが、次のようになります。

[UIView animateWithDuration:1.0 animations:^{
    [self.tableView setContentOffset:CGPointMake(0, newDistance) animated:NO];
    [self.tableView setRowHeight:newHeight];
}]; 

特定の方法が実際に存在するかどうかは疑問ですが、私が話していることは理解できると確信しており、似たようなものがあればそれを見つけるでしょう. nil元の呼び出しで as animation-parameter を使用することもできます。

beginUpdates(と呼ばれるものもありendUpdates、これが機能しない場合は調べることができますが、高さを変更できるかどうかはわかりません)

于 2013-08-22T01:07:10.860 に答える