【问题标题】:Animate [tableView reloadData]动画 [tableView reloadData]
【发布时间】:2015-02-05 19:50:53
【问题描述】:

我有一个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

【问题讨论】:

  • 调用reloadData 会破坏当前表格视图中的所有单元格并从头开始重建所有内容。如果这不是您想要的行为,您可能正在寻找其他方法。
  • 那么没有办法将UITableViewRowAnimationTop 与reloadData 一起使用?
  • 您尝试过使用beginUpdates 和更新块吗?
  • 你的意思是[tableView beginUpdates]; [tableView EndUpdates]?
  • 这个聚会有点晚了——根据您的描述,您希望细胞生长并适应新标签。一种现代的方法是使用“自动调整大小的单元格”并适当地设置自动布局。如果您使用的是自调整大小的单元格,那么您可以简单地执行以下操作:tableView.beginUpdates(); tableView.endUpdates() 并且单元格将适当地扩展合同以匹配其当前内容。不需要重新加载(除非表的有效索引路径集已更改)。您可以找到有关此here 方法的更多详细信息。

标签: ios objective-c uitableview reloaddata


【解决方案1】:

一个更简单的解决方案,不需要 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)

【讨论】:

    【解决方案2】:

    [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"];
    

    【讨论】:

    • 没有animation xcodes 智能检查器。
    • 我没明白你的意思。 CATransition 有一个名为 transition 的类方法。你确定你写的不是CATransaction
    • 你说得对,我用的是CATransaction。我刚试了一下,结果是,整个tableView宕机又备份,table甚至都没有重新加载?
    【解决方案3】:

    Swift 4 解决方案与 QuartzCore

    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")
    

    斯威夫特 5

    tableView.reloadData()
    let transition = CATransition()
    transition.type = .push
    transition.timingFunction = CAMediaTimingFunction(name: .easeInEaseOut)
    transition.fillMode = .forwards
    transition.duration = 0.6
    transition.subtype = .fromBottom
    

    【讨论】:

      【解决方案4】:

      或者这个:

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

      我个人认为 UITableViewRowAnimationFade 看起来好多了。

      【讨论】:

        【解决方案5】:

        这个 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)
        

        【讨论】:

        • 这种方法使用reloadData(),因此它允许对tableView结构的更新进行动画处理(不仅是行或节的插入、删除或更新,还包括重新获取或以其他方式更改数据源)。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-11-24
        • 2011-12-31
        • 1970-01-01
        相关资源
        最近更新 更多