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

sha*_*oga 26 uitableview ios

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

self.tableView.beginUpdates()
self.tableView.reloadSections(NSIndexSet(index: 1), withRowAnimation: UITableViewRowAnimation.None)
self.tableView.endUpdates()
Run Code Online (Sandbox Code Playgroud)

行替换仍然是动画的,表视图滚动到顶部.

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

n13*_*n13 55

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

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

  • 在Swift 4.1上为我工作过 (2认同)

Ale*_*ano 41

斯威夫特4:

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

UIView.performWithoutAnimation {
       self.tableView.reloadRows(at: [indexPath], with: .none)
}
Run Code Online (Sandbox Code Playgroud)

  • @KamilHarasimowicz:您无法删除 self,因为 UIView.performWithoutAnimation 是一个闭包。你需要在里面添加 self (3认同)

Abh*_*nav 36

试试这个:

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

  • 谢谢,为我工作.但是你应该再次启用动画.UIView.setAnimationsEnabled(真) (6认同)
  • UITableViewRowAnimation.none有什么意义? (3认同)
  • 对我来说不起作用 endUpdates() 崩溃了。libc++abi.dylib:以 NSException 类型的未捕获异常终止 (2认同)

小智 9

斯威夫特 5

UIView.performWithoutAnimation {
   self.tableView.reloadRows(at: [indexPath], with: .none)
  }
Run Code Online (Sandbox Code Playgroud)


小智 8

这两个答案都没有给我带来帮助.这是我找到的解决方案,希望它对某人有用

斯威夫特4:

let lastScrollOffset = tableView.contentOffset

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

tableView.layer.removeAllAnimations()
tableView.setContentOffset(lastScrollOffset, animated: false)
Run Code Online (Sandbox Code Playgroud)


Gur*_*ngh 5

在viewDidLoad中的这个方法中再添加一行

self.tableView.remembersLastFocusedIndexPath = true
Run Code Online (Sandbox Code Playgroud)

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

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


Oka*_*kan 5

Objective-C:

[UIView setAnimationsEnabled:NO];
   [[self tableView]beginUpdates];
   [self.tableView reloadSections:[[NSIndexSet alloc] initWithIndex:1] withRowAnimation:UITableViewRowAnimationNone];
   [[self tableView]endUpdates];
Run Code Online (Sandbox Code Playgroud)

但我认为下面的代码更有用、更好。

[UIView performWithoutAnimation:^{     
                [[self tableView]beginUpdates];
                [self.tableView reloadSections:[[NSIndexSet alloc] initWithIndex:1] withRowAnimation:UITableViewRowAnimationNone];
                [[self tableView]endUpdates];
            }];
Run Code Online (Sandbox Code Playgroud)