动画[tableView reloadData]

时间:2015-02-05 19:50:54

标签: ios objective-c uitableview reloaddata

我有UITableViewCell扩展并在点击时添加标签。

  

逻辑:

     

我在cellForRowAtIndexPath中添加了一个标签到所选单元格,并且   在didSelectRow...我重新加载了tableView。在heightForRow...中   选定的单元格扩展。希望你能得到这张照片。

didSelectRow...我必须重新加载数据,而不是开始/结束更新。我想要做的是reloadData并让它动画。我可以这样做:

[UIView transitionWithView: tableView
                  duration: 0.40f
                   options: UIViewAnimationOptionTransitionCrossDissolve
                animations: ^(void)
 {
   [self.tableView reloadData];
 }
                completion: nil
 }];

这就是正在改变的细胞的交叉溶解。我想要的是UITableViewRowAnimationTop,但显然在转换选项中是不可能的。有没有办法reloadData并使用UITableViewRowAnimationTop

5 个答案:

答案 0 :(得分:9)

一个更简单的解决方案,不需要CoreAnimation。

斯威夫特3:

UIView.transition(with: self.view,
                  duration: 0.15,
                  options: [.curveEaseInOut, .transitionCrossDissolve],
                  animations: {
                      self.tableView.reloadRows(at: self.tableView.indexPathsForVisibleRows!, with: .none)
}, completion: nil)

答案 1 :(得分:8)

[UITablewView reloadData:]不可动画。但是,您可能希望通过使用动画重新加载所有部分来尝试重新加载tableView。

NSIndexSet *sections = [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(0, [tableView numberOfSections])];

[self.tableView reloadSections:sections withRowAnimation:UITableViewRowAnimationAutomatic];

好吧,我骗了。它可能是可动画的,但它需要很多关于QuartzCore Framework如何对UI组件进行操作的知识。

@import QuartzCore;

[self.tableView reloadData];

CATransition *transition = [CATransition animation];
transition.type = kCATransitionPush;
transition.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
transition.fillMode = kCAFillModeForwards;
transition.duration = 0.6;
transition.subtype = kCATransitionFromTop;

[self.tableView.layer addAnimation:transition forKey:@"UITableViewReloadDataAnimationKey"];

答案 2 :(得分:1)

或者这个:

    NSIndexSet *sections = [NSIndexSet indexSetWithIndexesInRange: NSMakeRange(0, [self numberOfSectionsInTableView: self.tableView])];
    [self.tableView reloadSections: sections withRowAnimation: UITableViewRowAnimationTop];

就个人而言,我认为UITableViewRowAnimationFade看起来好多了。

答案 3 :(得分:1)

使用 QuartzCore

Swift 4 解决方案

import QuartzCore
tableView.reloadData()

let transition = CATransition()
transition.type = kCATransitionPush
transition.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut)
transition.fillMode = kCAFillModeForwards
transition.duration = 0.6
transition.subtype = kCATransitionFromBottom

tableView.layer.add(transition, forKey: "UITableViewReloadDataAnimationKey")

答案 4 :(得分:0)

这个UITableView扩展适用于Swift 4:

extension UITableView {
  func reloadDataWithAnimation(duration: TimeInterval, options: UIViewAnimationOptions) {
    UIView.animate(withDuration: duration, delay: 0.0, options: options, animations: { self.alpha = 0 }, completion: nil)
    self.reloadData()
    UIView.animate(withDuration: duration, delay: 0.0, options: options, animations: { self.alpha = 1 }, completion: nil)
  }
}

用法:

tableView.reloadDataWithAnimation(duration: 1.0, options: .curveLinear)