在没有滚动或动画的情况下重新加载 tableview 部分
Posted
技术标签:
【中文标题】在没有滚动或动画的情况下重新加载 tableview 部分【英文标题】:Reload tableview section without scroll or animation 【发布时间】:2015-10-26 04:57:10 【问题描述】:我正在使用此代码重新加载 tableView 部分 -
self.tableView.beginUpdates()
self.tableView.reloadSections(NSIndexSet(index: 1), withRowAnimation: UITableViewRowAnimation.None)
self.tableView.endUpdates()
仍然是行替换动画并且表格视图滚动到顶部。
如何确保没有动画将应用于部分重新加载 + 防止表格视图滚动。
【问题讨论】:
【参考方案1】:要防止滚动和动画,请执行以下操作:
UIView.performWithoutAnimation
let loc = tableView.contentOffset
tableView.reloadRows(at: [indexPath], with: .none)
tableView.contentOffset = loc
【讨论】:
在 ios9 上为我工作。惊人的技术!谢谢 Docs 说 .none 使用默认动画,但是使用此代码更新的行没有动画。谢谢。 我觉得应该是tableView.setContentOffset(loc, animated: false)
而不是tableView.contentOffset = loc
在 Swift 4.1 上为我工作
contentOffset
hack 对我来说不是必需的。 This answer here 就足够了。【参考方案2】:
Swift 4:
实际上,防止在滚动或展开/折叠单元格期间出现疯狂动画的最佳方法是:
UIView.performWithoutAnimation
self.tableView.reloadRows(at: [indexPath], with: .none)
【讨论】:
这确实有效,不仅在 Swift 4 上,而且在 3.2 上也是如此。此 API 似乎从 iOS 7.0 开始可用 谢谢! 您可以跳过self
调用中的tableView.reloadRows
以使代码更简洁。
@KamilHarasimowicz:你不能删除 self 因为 UIView.performWithoutAnimation 是一个闭包。您需要在其中添加 self 【参考方案3】:
试试这个:
UIView.setAnimationsEnabled(false)
self.tableView.beginUpdates()
self.tableView.reloadSections(NSIndexSet(index: 1) as IndexSet, with: UITableViewRowAnimation.none)
self.tableView.endUpdates()
【讨论】:
谢谢!...在 iOS 10.3 上为我工作,现在部分标题没有动画 谢谢,为我工作。但是您应该再次启用动画。 UIView.setAnimationsEnabled(true) 不适合我 endUpdates() 崩溃了。 libc++abi.dylib:以 NSException 类型的未捕获异常终止The inserted or deleted rows use the default animations
是什么意思【参考方案4】:
斯威夫特 5
UIView.performWithoutAnimation
self.tableView.reloadRows(at: [indexPath], with: .none)
【讨论】:
【参考方案5】:给定的答案都不适合我。 这是我找到的解决方案,希望对某人有用
斯威夫特 4:
let lastScrollOffset = tableView.contentOffset
tableView.beginUpdates()
tableView.reloadSections(IndexSet(integer: 1), with: .none)
tableView.endUpdates()
tableView.layer.removeAllAnimations()
tableView.setContentOffset(lastScrollOffset, animated: false)
【讨论】:
不适用于我,libc++abi.dylib:以 NSException 类型的未捕获异常终止【参考方案6】:在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()
【讨论】:
【参考方案7】:目标-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];
];
【讨论】:
我认为这种方法更干净。【参考方案8】:我也遇到过这个问题。它似乎源于将 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)
【讨论】:
以上是关于在没有滚动或动画的情况下重新加载 tableview 部分的主要内容,如果未能解决你的问题,请参考以下文章
如何在不重新加载图像的情况下重新加载 collectionview 单元格