uitableviewの更新の開始、更新の終了ブロックにアニメーションが必要ありませんか?


89

カスタムテーブルセルを使用しているUITableViewがあり、各セルにはUIWebViewがあります。

UIWebViewの読み込みには時間がかかったので、絶対に再読み込みを避けたいと思います。状況によっては、すべてのセルをロードしましたが、それらの高さが台無しになっています。したがって、「cellForRow」関数をトリガーせずにテーブルを「再レイアウト」する必要があります。

  1. セルを再度リロードするため、reloadDataを使用することはできません。
  2. tableView.setNeedDisplay、setNeedsLayoutなどを試しましたが、いずれもテーブルセルを再配置できません
  3. それが機能した唯一の方法は、beginupdates / endupdatesブロックを呼び出すことです。このブロックは、cellForRowを起動せずにテーブルをリレーアウトできます。しかし、私はアニメーションが欲しくありませんでした!このブロックはアニメーション効果を生成しますが、私はそれを望んでいません...

どうすれば問題を解決できますか?

回答:


217
[UIView setAnimationsEnabled:NO];
[tableView beginUpdates];
[tableView endUpdates];
[UIView setAnimationsEnabled:YES];

1
これは素晴らしい!私はそれがいくつかの最も興味深いアプリケーションを持っていると思います。を渡しても、セクションの再読み込みメソッドは常にアニメーション化されることがわかりましたUITableViewRowAnimationNoneが、これを使用すると、アニメーションを簡単にバイパスできます。
flying_Banana 2015

65

ブロックを使用してそれを行うもう1つの方法

Obj-C

[UIView performWithoutAnimation:^{
   [self.tableView beginUpdates];
   [self.tableView endUpdates];
}];

迅速

UIView.performWithoutAnimation {
    tableView.beginUpdates()
    tableView.endUpdates()   
}

4

私のプロジェクトに取り組んでいますが、一般的な解決策ではありません。

let loc = tableView.contentOffset
UIView.performWithoutAnimation {

    tableView.reloadData()

    tableView.layoutIfNeeded()
    tableView.beginUpdates()
    tableView.endUpdates()

    tableView.layer.removeAllAnimations()
}
tableView.setContentOffset(loc, animated: true)//animation true may perform better

3

Swifties これが機能するためには、次のことをしなければなりませんでした

// Sadly, this is not as simple as calling:
//      UIView.setAnimationsEnabled(false)
//      self.tableView.beginUpdates()
//      self.tableView.endUpdates()
//      UIView.setAnimationsEnabled(true)

// We need to disable the animations.
UIView.setAnimationsEnabled(false)
CATransaction.begin()

// And we also need to set the completion block,
CATransaction.setCompletionBlock { () -> Void in
    // of the animation.
    UIView.setAnimationsEnabled(true)
}

// Call the stuff we need to.
self.tableView.beginUpdates()
self.tableView.endUpdates()

// Commit the animation.
CATransaction.commit()

助けて頂きました。ありがとう。setAnimationsEnabled(true)完了ブロック内に配置することが重要です。
ラッセバンク2016年

ただし、テーブルビューをスクロールするまで、これはフッターを更新しません。
ビーン氏2017年

@ Mr.Bean完全なケースは何ですか?(つまり、テーブルビューには常にフッターがありますか?フッターを挿入しようとしていますか、それとも削除しようとしていますか?)
Neil Japhtha 2017

常にフッターを用意し、フッターを更新するだけです(つまり、フッター内に2つのビューがあり、条件に応じてビューを非表示/再表示する必要があります)
Mr. Bean 2017

@ Mr.Bean更新ブロックには何が含まれていますか?ここで最も拡張可能な方法は、セクションをリロードすることです。
Neil Japhtha 2017

1

私はスムーズな移行を望んでいます:

CGPoint offset = self.tableView.contentOffset;
[UIView transitionWithView:self.tableView duration:0.5 options:UIViewAnimationOptionTransitionCrossDissolve animations:^{
        [self.tableView reloadData];
        self.tableView.contentOffset = offset;
    } completion:nil];

試してみる。


0

セクション5のセルの高さを更新したかったので、次のコードが機能しました。

UiView.setAnimationsEnabled(False)
self.productTableView.reloadSections(NSIndexSet(index: SectionType.ProductDescription.hashValue), withRowAnimation: UITableViewRowAnimation.None)
self.productTableView.scrollToRowAtIndexPath(NSIndexPath(forRow: 0, inSection: 5), atScrollPosition: UITableViewScrollPosition.Bottom, animated: false)
UIView.setAnimationsEnabled(true)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.