重新加载没有滚动或动画的tableview部分

时间:2015-10-26 04:57:10

标签: ios uitableview

我正在使用此代码重新加载tableView部分 -

self.tableView.beginUpdates()
self.tableView.reloadSections(NSIndexSet(index: 1), withRowAnimation: UITableViewRowAnimation.None)
self.tableView.endUpdates()

仍然将行替换设置为动画,并且表格视图滚动到顶部。

如何确保不会将动画应用于重新加载部分+阻止表格视图滚动。

8 个答案:

答案 0 :(得分:43)

要防止滚动和动画,请执行以下操作:

UIView.performWithoutAnimation { 
    let loc = tableView.contentOffset
    tableView.reloadRows(at: [indexPath], with: .none)
    tableView.contentOffset = loc
}

答案 1 :(得分:33)

Swift 4

实际上,在滚动或展开/折叠单元格期间防止疯狂动画的最佳方法是:

<div ng-repeat="movie in movies">
  <b>{{movie.title}}</b>
  <i ng-repeat="genre in movie.genres">{{($index > 0 ? ', ' : '') + genres[genre]}}</i>
</div>

答案 2 :(得分:28)

试试这个:

UIView.setAnimationsEnabled(false)
self.tableView.beginUpdates()
self.tableView.reloadSections(NSIndexSet(index: 1) as IndexSet, with: UITableViewRowAnimation.none)
self.tableView.endUpdates()

答案 3 :(得分:7)

给定的答案都不适合我。 这是我找到的解决方案,希望它对某人有用

Swift 4:

let lastScrollOffset = tableView.contentOffset

tableView.beginUpdates()
tableView.reloadSections(IndexSet(integer: 1), with: .none)
tableView.endUpdates()

tableView.layer.removeAllAnimations()
tableView.setContentOffset(lastScrollOffset, animated: false)

答案 4 :(得分:1)

在viewDidLoad的此方法中多添加一行

self.tableView.remembersLastFocusedIndexPath = true

将此代码添加到更新后要刷新的位置

UIView.setAnimationsEnabled(false)
    self.tableView.beginUpdates()
    self.tableView.reloadSections(NSIndexSet(index: 1) as IndexSet, with: UITableViewRowAnimation.none)
    self.tableView.endUpdates()

答案 5 :(得分:1)

Objective-C:

[UIView setAnimationsEnabled:NO];
   [[self tableView]beginUpdates];
   [self.tableView reloadSections:[[NSIndexSet alloc] initWithIndex:1] withRowAnimation:UITableViewRowAnimationNone];
   [[self tableView]endUpdates];

但是我认为以下代码更有用,更好。

[UIView performWithoutAnimation:^{     
                [[self tableView]beginUpdates];
                [self.tableView reloadSections:[[NSIndexSet alloc] initWithIndex:1] withRowAnimation:UITableViewRowAnimationNone];
                [[self tableView]endUpdates];
            }];

答案 6 :(得分:0)

快速5

UIView.performWithoutAnimation {
   self.tableView.reloadRows(at: [indexPath], with: .none)
  }

答案 7 :(得分:0)

我也遇到了这个问题。似乎是由于将IndexPath放在.reloadSections而不是它所要求的IndexSet内。这就是为什么它似乎可以与.reloadRows一起使用而没有问题的原因:

tableView.reloadRows(at: [IndexPath], with: UITableView.RowAnimation)

tableView.reloadSections(IndexSet, with: UITableView.RowAnimation)

只需将要重新加载的部分包装为IndexSet:

tableView.reloadSections(IndexSet(integer: sectionInt), with: .none)