8

I am animating a UITableView. I want the table view to slide open like this:

http://www.youtube.com/watch?v=XIGJLbiRsXE

However, it opens like this:

http://www.youtube.com/watch?v=UJUX-ILCB_0

Notice how the table cells themselves are animating. How can I stop this from happening?

I am using autolayout. The code is thus:

[theView addSubview:theTable];
[theTable reloadData];
[theTable invalidateIntrinsicContentSize];
[UIView animateWithDuration:.33 animations:^{
    [theView layoutIfNeeded];
 }];

Other details, which may or may not matter:

  • The table view's parent is a scrollView

  • I have overridden the intrinsicContentSize of the table view to return the height of all the cells in the table view, so the table view will not scroll

  • I am changing the datasource of the table view before displaying it

4

4 に答える 4

13

同様の問題があり、 UIViewperformWithoutAnimation:メソッドを使用して UITableViewCell のアニメーションを停止できました。

tableView:willDisplayCell:forRowAtIndexPath:UITableViewDelegate メソッドを使用して、表示される前にセルへの参照を取得します。次に、performWithoutAnimation:ブロック内layoutIfNeededで cell オブジェクトを呼び出して、サブビューをレイアウトする機会を与えます。

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
    [UIView performWithoutAnimation:^{
        [cell layoutIfNeeded];
    }];
}
于 2014-10-19T20:00:06.053 に答える
2

この質問に答えるには遅すぎるかもしれませんが、このような場合の問題は、通常、次の実行ループでスケジュールされているすべての保留中のレイアウトをキャプチャするアニメーション ブロックにあります。

私が使用する解決策はです。アニメーションの前 (制約を設定または無効にする前) に layoutIfNeeded を呼び出し、次にアニメーション ブロック内で呼び出します。

あなたの場合、それはこのようなものになります、

[theView addSubview:theTable];
[theTable reloadData];
[theView layoutIfNeeded];
[theTable invalidateIntrinsicContentSize];
[UIView animateWithDuration:.33 animations:^{
    [theView layoutIfNeeded];
 }];
于 2016-01-02T14:00:36.257 に答える
0

アニメーション ブロック内で [theView layoutIfNeeded] を呼び出す前に、まずテーブルをレイアウトしてみてください。理想的には、断片的にレイアウトでき、その 0.33 秒間、テーブルにスクロール バーが表示される可能性がありますが、目標は、アニメートされたブロックの外でテーブル セルのレイアウトの変更を取得することです。

于 2013-04-30T01:47:16.997 に答える
0

代わりに、テーブル ビューの上に配置された不透明なサブビューをアニメーション化することを検討しましたか?

[theView addSubview:theTable];
[theTable reloadData];

UIView *subview = [[UIView alloc] initWithFrame:theTable.frame];
subview.backgroundColor = [UIColor whiteColor];
[theView addSubview:subview];

[UIView animateWithDuration:0.33 animations:^{
    subview.frame = CGRectMake(subview.frame.origin.x, subview.frame.size.height, subview.frame.size.width, 0.0);
}];
于 2013-04-29T19:20:55.550 に答える