我不希望动画在开始更新,结束更新块为uitableview?

时间:2012-02-16 10:48:29

标签: objective-c uitableview

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

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

  1. 我绝对不能使用reloadData ...因为它会重新加载单元格。
  2. 我尝试了tableView.setNeedDisplay,setNeedsLayout等,没有一个能够重新排列表格单元格
  3. 它工作的唯一方法是调用beginupdates / endupdates块,这个块能够重新启动我的表而不需要激活cellForRow!但是,我不想要动画!这个块产生动画效果,但我不想要它......
  4. 如何解决我的问题?

6 个答案:

答案 0 :(得分:199)

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

答案 1 :(得分:48)

使用块

的另一种方法

<强>的OBJ-C

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

<强>夫特

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

答案 2 :(得分: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()

答案 3 :(得分:3)

在我的项目上工作,但不是常见的解决方案。

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

答案 4 :(得分: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];

试一试。

答案 5 :(得分:0)

我想更新第5部分的单元格高度以及以下代码为我工作:

Select 1 as value