我不想在uitableview的开始更新,结束更新块中使用动画?


89

我有一个使用自定义表格单元格的UITableView,每个单元格都有一个UIWebView。

因为UIWebView需要花费一些时间来加载,所以我想避免不惜一切代价重新加载它们。在某些情况下,我已加载所有单元格,但它们的高度却混乱了。因此,我需要“重新布局”表而不触发“ cellForRow”功能。

  1. 我绝对不能使用reloadData ...,因为它将再次重新加载单元格。
  2. 我尝试了tableView.setNeedDisplay,setNeedsLayout等,它们都无法重新排列表格单元格
  3. 它工作的唯一方法是调用beginupdates / endupdates块,该块能够在不触发cellForRow的情况下重新分发我的表!但是,我不想动画!这个块产生动画效果,但是我不想要它。

我该如何解决我的问题?

Answers:


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

1
这很棒!我发现它具有一些最有趣的应用程序。我发现即使您传入,reloadsection方法也将始终设置动画UITableViewRowAnimationNone,但是通过此方法可以轻松绕过动画!
Flying_Banana

65

使用块的另一种方法

对象

[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)完成块中。
Lasse Bunk

但这不会更新页脚,直到您滚动表格视图。
豆先生

@Bean先生的完整情况是什么?(即您的表视图是否总是有页脚,您是要插入页脚还是删除页脚?)
Neil Japhtha

始终有一个页脚,只需要更新页脚即可(即页脚内部有2个视图,需要根据情况隐藏/取消隐藏这些视图。)
Mr豆先生

@ Mr.Bean您的更新块包含什么?这里最可扩展的方法是重新加载该部分。
Neil Japhtha

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)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.